@agent-native/core 0.152.1 → 0.153.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (927) 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/components/calendar/DayView.tsx +3 -2
  99. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +3 -2
  100. package/corpus/templates/calendar/app/lib/event-layout.ts +16 -35
  101. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +1 -0
  102. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +3 -2
  103. package/corpus/templates/chat/.agents/skills/context-awareness/SKILL.md +206 -0
  104. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +73 -80
  105. package/corpus/templates/chat/.agents/skills/portability/SKILL.md +107 -0
  106. package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +339 -0
  107. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +3 -3
  108. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +1 -1
  109. package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +1 -0
  110. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +116 -44
  111. package/corpus/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  112. package/corpus/templates/chat/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  113. package/corpus/templates/chat/.agents/skills/workspace-conventions/SKILL.md +93 -0
  114. package/corpus/templates/chat/AGENTS.md +4 -5
  115. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +73 -80
  116. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  117. package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +339 -0
  118. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +3 -3
  119. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +1 -1
  120. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +116 -44
  121. package/corpus/templates/clips/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  122. package/corpus/templates/clips/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  123. package/corpus/templates/clips/.agents/skills/workspace-conventions/SKILL.md +93 -0
  124. package/corpus/templates/clips/actions/add-comment.ts +1 -2
  125. package/corpus/templates/clips/actions/delete-comment.ts +2 -0
  126. package/corpus/templates/clips/actions/get-recording-insights.ts +9 -8
  127. package/corpus/templates/clips/actions/get-recording-player-data.ts +4 -1
  128. package/corpus/templates/clips/actions/react-to-comment.ts +1 -1
  129. package/corpus/templates/clips/actions/react-to-recording.ts +1 -1
  130. package/corpus/templates/clips/actions/reply-to-comment.ts +1 -1
  131. package/corpus/templates/clips/actions/resolve-comment.ts +1 -2
  132. package/corpus/templates/clips/actions/update-comment.ts +1 -1
  133. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +1 -0
  134. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +59 -16
  135. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +27 -44
  136. package/corpus/templates/clips/app/components/player/comments-panel.tsx +88 -39
  137. package/corpus/templates/clips/app/components/player/share-dialog.tsx +84 -41
  138. package/corpus/templates/clips/app/components/player/timestamped-comment-button.tsx +3 -1
  139. package/corpus/templates/clips/app/components/player/video-player.tsx +1 -1
  140. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +20 -7
  141. package/corpus/templates/clips/app/i18n/en-US.ts +2 -1
  142. package/corpus/templates/clips/app/lib/public-meeting.ts +1 -1
  143. package/corpus/templates/clips/app/lib/thumbnail-capture.ts +71 -0
  144. package/corpus/templates/clips/app/lib/thumbnail-picker-state.ts +93 -0
  145. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +1 -1
  146. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +25 -19
  147. package/corpus/templates/clips/app/routes/share.$shareId.tsx +8 -0
  148. package/corpus/templates/clips/changelog/2026-07-23-meeting-recording-meters-and-dismissed-prompts.md +1 -1
  149. package/corpus/templates/clips/changelog/2026-08-11-clips-asks-to-take-notes-again-when-you-join-an-adhoc-zoom-o.md +6 -0
  150. package/corpus/templates/clips/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  151. package/corpus/templates/clips/desktop/src/app.tsx +1 -1
  152. package/corpus/templates/clips/desktop/src/styles.css +10 -2
  153. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +166 -14
  154. package/corpus/templates/clips/desktop/src-tauri/src/call_activity.rs +146 -0
  155. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +2 -2
  156. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -0
  157. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +2 -122
  158. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +1 -1
  159. package/corpus/templates/clips/server/lib/recording-page-access.ts +6 -1
  160. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +5 -0
  161. package/corpus/templates/clips/shared/share-meta.ts +19 -3
  162. package/corpus/templates/content/.agents/skills/adding-a-feature/SKILL.md +208 -0
  163. package/corpus/templates/content/.agents/skills/context-awareness/SKILL.md +206 -0
  164. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +73 -80
  165. package/corpus/templates/content/.agents/skills/portability/SKILL.md +107 -0
  166. package/corpus/templates/content/.agents/skills/secrets/SKILL.md +339 -0
  167. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +3 -3
  168. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +1 -1
  169. package/corpus/templates/content/.agents/skills/sharing/SKILL.md +1 -0
  170. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +116 -44
  171. package/corpus/templates/content/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  172. package/corpus/templates/content/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  173. package/corpus/templates/content/.agents/skills/workspace-conventions/SKILL.md +93 -0
  174. package/corpus/templates/content/actions/_database-utils.ts +10 -0
  175. package/corpus/templates/content/actions/add-comment.ts +1 -1
  176. package/corpus/templates/content/actions/attach-content-database-source.ts +158 -61
  177. package/corpus/templates/content/actions/create-document.ts +1 -0
  178. package/corpus/templates/content/actions/delete-comment.ts +1 -1
  179. package/corpus/templates/content/actions/get-document.ts +9 -1
  180. package/corpus/templates/content/actions/import-content-source.ts +8 -0
  181. package/corpus/templates/content/actions/list-documents.ts +10 -1
  182. package/corpus/templates/content/actions/update-comment.ts +1 -1
  183. package/corpus/templates/content/actions/update-document.ts +11 -0
  184. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +52 -29
  185. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +13 -8
  186. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +62 -2
  187. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +163 -53
  188. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +16 -0
  189. package/corpus/templates/content/app/components/editor/database/settings.tsx +22 -13
  190. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +7 -7
  191. package/corpus/templates/content/app/hooks/use-documents.ts +2 -0
  192. package/corpus/templates/content/app/i18n-data.ts +10 -0
  193. package/corpus/templates/content/app/root.tsx +1 -21
  194. package/corpus/templates/content/changelog/2026-08-05-connect-sources-from-add-column.md +6 -0
  195. package/corpus/templates/content/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  196. package/corpus/templates/content/shared/api.ts +7 -1
  197. package/corpus/templates/crm/.agents/skills/actions/SKILL.md +146 -0
  198. package/corpus/templates/crm/.agents/skills/actions/references/action-fields.md +136 -0
  199. package/corpus/templates/crm/.agents/skills/actions/references/examples.md +94 -0
  200. package/corpus/templates/crm/.agents/skills/actions/references/provider-apis.md +95 -0
  201. package/corpus/templates/crm/.agents/skills/adding-a-feature/SKILL.md +208 -0
  202. package/corpus/templates/crm/.agents/skills/context-awareness/SKILL.md +206 -0
  203. package/corpus/templates/crm/.agents/skills/delegate-to-agent/SKILL.md +289 -0
  204. package/corpus/templates/crm/.agents/skills/frontend-design/SKILL.md +296 -0
  205. package/corpus/templates/crm/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  206. package/corpus/templates/crm/.agents/skills/portability/SKILL.md +107 -0
  207. package/corpus/templates/crm/.agents/skills/real-time-sync/SKILL.md +232 -0
  208. package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +339 -0
  209. package/corpus/templates/crm/.agents/skills/security/SKILL.md +324 -0
  210. package/corpus/templates/crm/.agents/skills/self-modifying-code/SKILL.md +123 -0
  211. package/corpus/templates/crm/.agents/skills/shadcn-ui/SKILL.md +123 -0
  212. package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +1 -0
  213. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +116 -44
  214. package/corpus/templates/crm/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  215. package/corpus/templates/crm/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  216. package/corpus/templates/crm/.agents/skills/workspace-conventions/SKILL.md +93 -0
  217. package/corpus/templates/design/.agents/skills/adding-a-feature/SKILL.md +208 -0
  218. package/corpus/templates/design/.agents/skills/context-awareness/SKILL.md +206 -0
  219. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +73 -80
  220. package/corpus/templates/design/.agents/skills/portability/SKILL.md +107 -0
  221. package/corpus/templates/design/.agents/skills/real-time-sync/SKILL.md +232 -0
  222. package/corpus/templates/design/.agents/skills/secrets/SKILL.md +339 -0
  223. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +3 -3
  224. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +1 -1
  225. package/corpus/templates/design/.agents/skills/sharing/SKILL.md +1 -0
  226. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +116 -44
  227. package/corpus/templates/design/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  228. package/corpus/templates/design/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  229. package/corpus/templates/design/.agents/skills/workspace-conventions/SKILL.md +93 -0
  230. package/corpus/templates/design/actions/index-design-system-with-builder.ts +16 -2
  231. package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +6 -18
  232. package/corpus/templates/design/app/i18n/en-US.ts +1 -1
  233. package/corpus/templates/design/app/i18n-data.ts +40 -0
  234. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +153 -131
  235. package/corpus/templates/design/app/pages/DesignSystems.tsx +7 -61
  236. package/corpus/templates/design/app/pages/Present.tsx +8 -2
  237. package/corpus/templates/design/app/pages/Templates.tsx +1 -0
  238. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +4 -1
  239. package/corpus/templates/design/app/pages/design-editor/types.ts +6 -1
  240. package/corpus/templates/design/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  241. package/corpus/templates/dispatch/.agents/skills/adding-a-feature/SKILL.md +208 -0
  242. package/corpus/templates/dispatch/.agents/skills/context-awareness/SKILL.md +206 -0
  243. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +73 -80
  244. package/corpus/templates/dispatch/.agents/skills/portability/SKILL.md +107 -0
  245. package/corpus/templates/dispatch/.agents/skills/real-time-sync/SKILL.md +232 -0
  246. package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +339 -0
  247. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +3 -3
  248. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +1 -1
  249. package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +1 -0
  250. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +116 -44
  251. package/corpus/templates/dispatch/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  252. package/corpus/templates/dispatch/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  253. package/corpus/templates/dispatch/.agents/skills/workspace-conventions/SKILL.md +93 -0
  254. package/corpus/templates/dispatch/actions/apply-workspace-connection-setup.ts +97 -15
  255. package/corpus/templates/dispatch/actions/connection-permissions.ts +77 -0
  256. package/corpus/templates/dispatch/actions/delete-workspace-connection.ts +12 -2
  257. package/corpus/templates/dispatch/actions/list-workspace-user-groups.ts +19 -0
  258. package/corpus/templates/dispatch/actions/plan-workspace-connection-setup.ts +9 -2
  259. package/corpus/templates/dispatch/actions/set-workspace-connection-grant.ts +21 -2
  260. package/corpus/templates/dispatch/actions/upsert-workspace-connection.ts +66 -1
  261. package/corpus/templates/dispatch/actions/upsert-workspace-user-group.ts +27 -0
  262. package/corpus/templates/dispatch/app/chat-first-pages.ts +84 -0
  263. package/corpus/templates/dispatch/app/i18n-data.ts +3989 -3527
  264. package/corpus/templates/dispatch/app/routes/integrations.tsx +1568 -685
  265. package/corpus/templates/dispatch/app/routes/settings.tsx +14 -9
  266. package/corpus/templates/dispatch/changelog/2026-08-12-search-and-pin-workspace-apps-from-the-app-catalog.md +6 -0
  267. package/corpus/templates/dispatch/changelog/2026-08-12-workspace-integration-access-now-shows-exactly-which-apps-ca.md +6 -0
  268. package/corpus/templates/dispatch/server/lib/app-roles.ts +5 -0
  269. package/corpus/templates/dispatch/shared/app-roles.ts +1 -0
  270. package/corpus/templates/factory/.agents/skills/adding-a-feature/SKILL.md +3 -2
  271. package/corpus/templates/factory/.agents/skills/context-awareness/SKILL.md +206 -0
  272. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +73 -80
  273. package/corpus/templates/factory/.agents/skills/portability/SKILL.md +107 -0
  274. package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +339 -0
  275. package/corpus/templates/factory/.agents/skills/self-modifying-code/SKILL.md +3 -3
  276. package/corpus/templates/factory/.agents/skills/shadcn-ui/SKILL.md +1 -1
  277. package/corpus/templates/factory/.agents/skills/sharing/SKILL.md +1 -0
  278. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +116 -44
  279. package/corpus/templates/factory/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  280. package/corpus/templates/factory/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  281. package/corpus/templates/factory/.agents/skills/workspace-conventions/SKILL.md +93 -0
  282. package/corpus/templates/factory/AGENTS.md +10 -1
  283. package/corpus/templates/factory/README.md +18 -7
  284. package/corpus/templates/factory/actions/list-triage-items.ts +10 -4
  285. package/corpus/templates/factory/actions/poll-github-sources.ts +53 -14
  286. package/corpus/templates/factory/actions/poll-sentry-errors.ts +31 -13
  287. package/corpus/templates/factory/actions/poll-slack-channel.ts +41 -5
  288. package/corpus/templates/factory/actions/provider-api-catalog.ts +13 -0
  289. package/corpus/templates/factory/actions/provider-api-docs.ts +11 -0
  290. package/corpus/templates/factory/actions/provider-api-request.ts +17 -0
  291. package/corpus/templates/factory/actions/save-triage-config.ts +87 -38
  292. package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +14 -12
  293. package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +60 -77
  294. package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +66 -125
  295. package/corpus/templates/factory/app/components/layout/Header.tsx +1 -0
  296. package/corpus/templates/factory/app/components/layout/Layout.tsx +8 -3
  297. package/corpus/templates/factory/app/components/layout/Sidebar.tsx +9 -5
  298. package/corpus/templates/factory/app/components/ui/input.tsx +15 -1
  299. package/corpus/templates/factory/app/components/ui/popover.tsx +1 -0
  300. package/corpus/templates/factory/app/components/ui/switch.tsx +1 -0
  301. package/corpus/templates/factory/app/components/ui/textarea.tsx +20 -1
  302. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +5 -3
  303. package/corpus/templates/factory/app/i18n/en-US.ts +17 -0
  304. package/corpus/templates/factory/app/routes/_index.tsx +5 -87
  305. package/corpus/templates/factory/app/routes/chat.$threadId.tsx +1 -1
  306. package/corpus/templates/factory/app/routes/chat.tsx +91 -0
  307. package/corpus/templates/factory/app/routes/factory.tsx +554 -430
  308. package/corpus/templates/factory/app/routes/settings.tsx +1 -1
  309. package/corpus/templates/factory/server/connectors/credentials.ts +25 -0
  310. package/corpus/templates/factory/server/lib/provider-api.ts +34 -0
  311. package/corpus/templates/factory/server/plugins/agent-chat.ts +15 -3
  312. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +96 -24
  313. package/corpus/templates/factory/server/triage/review-state.ts +33 -0
  314. package/corpus/templates/factory/server/triage/slack-poller.ts +1 -0
  315. package/corpus/templates/forms/.agents/skills/adding-a-feature/SKILL.md +208 -0
  316. package/corpus/templates/forms/.agents/skills/context-awareness/SKILL.md +206 -0
  317. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +73 -80
  318. package/corpus/templates/forms/.agents/skills/portability/SKILL.md +107 -0
  319. package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +339 -0
  320. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +3 -3
  321. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +1 -1
  322. package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +1 -0
  323. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +116 -44
  324. package/corpus/templates/forms/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  325. package/corpus/templates/forms/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  326. package/corpus/templates/forms/.agents/skills/workspace-conventions/SKILL.md +93 -0
  327. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +1 -0
  328. package/corpus/templates/forms/shared/types.ts +1 -1
  329. package/corpus/templates/macros/.agents/skills/adding-a-feature/SKILL.md +208 -0
  330. package/corpus/templates/macros/.agents/skills/context-awareness/SKILL.md +206 -0
  331. package/corpus/templates/macros/.agents/skills/delegate-to-agent/SKILL.md +289 -0
  332. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +73 -80
  333. package/corpus/templates/macros/.agents/skills/portability/SKILL.md +107 -0
  334. package/corpus/templates/macros/.agents/skills/real-time-sync/SKILL.md +232 -0
  335. package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +339 -0
  336. package/corpus/templates/macros/.agents/skills/self-modifying-code/SKILL.md +123 -0
  337. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +1 -1
  338. package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +1 -0
  339. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +116 -44
  340. package/corpus/templates/macros/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  341. package/corpus/templates/macros/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  342. package/corpus/templates/macros/.agents/skills/workspace-conventions/SKILL.md +93 -0
  343. package/corpus/templates/mail/.agents/skills/adding-a-feature/SKILL.md +208 -0
  344. package/corpus/templates/mail/.agents/skills/context-awareness/SKILL.md +206 -0
  345. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +73 -80
  346. package/corpus/templates/mail/.agents/skills/portability/SKILL.md +107 -0
  347. package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +339 -0
  348. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +3 -3
  349. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +1 -1
  350. package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +1 -0
  351. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +116 -44
  352. package/corpus/templates/mail/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  353. package/corpus/templates/mail/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  354. package/corpus/templates/mail/.agents/skills/workspace-conventions/SKILL.md +93 -0
  355. package/corpus/templates/mail/actions/send-email.ts +9 -0
  356. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +4 -4
  357. package/corpus/templates/mail/changelog/2026-08-12-agent-sent-messages-appear-immediately.md +6 -0
  358. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +3 -2
  359. package/corpus/templates/plan/.agents/skills/context-awareness/SKILL.md +206 -0
  360. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +73 -80
  361. package/corpus/templates/plan/.agents/skills/portability/SKILL.md +107 -0
  362. package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +339 -0
  363. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +3 -3
  364. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +1 -1
  365. package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +1 -0
  366. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +116 -44
  367. package/corpus/templates/plan/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  368. package/corpus/templates/plan/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  369. package/corpus/templates/plan/.agents/skills/workspace-conventions/SKILL.md +93 -0
  370. package/corpus/templates/plan/actions/delete-plan-comment.ts +6 -0
  371. package/corpus/templates/plan/actions/reply-to-plan-comment.ts +7 -1
  372. package/corpus/templates/plan/actions/resolve-plan-comment.ts +7 -1
  373. package/corpus/templates/plan/actions/update-visual-plan.ts +6 -0
  374. package/corpus/templates/plan/app/hooks/use-plans.ts +1 -1
  375. package/corpus/templates/plan/app/pages/PlansPage.tsx +51 -23
  376. package/corpus/templates/plan/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  377. package/corpus/templates/plan/server/plans.ts +2 -2
  378. package/corpus/templates/plan/shared/types.ts +1 -1
  379. package/corpus/templates/slides/.agents/skills/adding-a-feature/SKILL.md +208 -0
  380. package/corpus/templates/slides/.agents/skills/context-awareness/SKILL.md +206 -0
  381. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +6 -0
  382. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +73 -80
  383. package/corpus/templates/slides/.agents/skills/portability/SKILL.md +107 -0
  384. package/corpus/templates/slides/.agents/skills/real-time-sync/SKILL.md +232 -0
  385. package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +339 -0
  386. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +3 -3
  387. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +1 -1
  388. package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +1 -0
  389. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +116 -44
  390. package/corpus/templates/slides/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  391. package/corpus/templates/slides/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  392. package/corpus/templates/slides/.agents/skills/workspace-conventions/SKILL.md +93 -0
  393. package/corpus/templates/slides/AGENTS.md +4 -0
  394. package/corpus/templates/slides/actions/add-slide-comment.ts +1 -1
  395. package/corpus/templates/slides/actions/delete-slide-comment.ts +1 -1
  396. package/corpus/templates/slides/actions/get-layout-overflows.ts +67 -2
  397. package/corpus/templates/slides/actions/update-slide-comment.ts +1 -1
  398. package/corpus/templates/slides/actions/view-screen.ts +76 -26
  399. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +30 -8
  400. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +2 -1
  401. package/corpus/templates/slides/app/components/editor/AlignmentGuides.tsx +75 -0
  402. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +81 -81
  403. package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +28 -25
  404. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +175 -10
  405. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +256 -69
  406. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +1 -1
  407. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +3 -3
  408. package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +218 -0
  409. package/corpus/templates/slides/app/context/DeckContext.tsx +56 -30
  410. package/corpus/templates/slides/app/hooks/use-deck-role.ts +13 -5
  411. package/corpus/templates/slides/app/hooks/use-design-systems.ts +1 -1
  412. package/corpus/templates/slides/app/i18n/en-US.ts +6 -2
  413. package/corpus/templates/slides/app/lib/create-deck-generation.ts +1 -0
  414. package/corpus/templates/slides/app/lib/pending-deck-changes.ts +32 -0
  415. package/corpus/templates/slides/app/pages/DeckEditor.tsx +85 -4
  416. package/corpus/templates/slides/app/pages/Index.tsx +65 -66
  417. package/corpus/templates/slides/changelog/2026-08-12-viewers-are-read-only-and-commenters-can-comment.md +6 -0
  418. package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +3 -2
  419. package/corpus/templates/tasks/.agents/skills/context-awareness/SKILL.md +206 -0
  420. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +73 -80
  421. package/corpus/templates/tasks/.agents/skills/portability/SKILL.md +107 -0
  422. package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +339 -0
  423. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +3 -3
  424. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +1 -1
  425. package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +1 -0
  426. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +116 -44
  427. package/corpus/templates/tasks/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  428. package/corpus/templates/tasks/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  429. package/corpus/templates/tasks/.agents/skills/workspace-conventions/SKILL.md +93 -0
  430. package/corpus/templates/tasks/app/components/custom-fields/FieldsPage.tsx +1 -4
  431. package/corpus/templates/tasks/app/components/inbox/InboxList.tsx +0 -1
  432. package/corpus/templates/tasks/app/components/inbox/InboxListPage.tsx +0 -1
  433. package/corpus/templates/tasks/app/components/shared/ListViewHeader.tsx +0 -3
  434. package/corpus/templates/tasks/app/components/shared/PageHeader.tsx +1 -4
  435. package/corpus/templates/tasks/app/components/tasks/TaskList.tsx +0 -1
  436. package/corpus/templates/tasks/app/components/tasks/TaskListPage.tsx +0 -1
  437. package/dist/agent/engine/ai-sdk-engine.js +5 -0
  438. package/dist/agent/engine/anthropic-engine.js +8 -0
  439. package/dist/agent/engine/registry.js +24 -19
  440. package/dist/agent/engine/translate-anthropic.js +16 -1
  441. package/dist/agent/production-agent.d.ts +8 -0
  442. package/dist/agent/production-agent.js +25 -2
  443. package/dist/agent/run-manager.js +13 -3
  444. package/dist/automations/service.d.ts +2 -0
  445. package/dist/automations/service.js +5 -1
  446. package/dist/chat-threads/schema.d.ts +2 -2
  447. package/dist/cli/changelog.js +21 -4
  448. package/dist/cli/create.d.ts +12 -1
  449. package/dist/cli/create.js +99 -11
  450. package/dist/cli/index.js +6 -6
  451. package/dist/cli/process.d.ts +7 -0
  452. package/dist/cli/process.js +12 -0
  453. package/dist/cli/workspace-skill-policy.d.ts +15 -0
  454. package/dist/cli/workspace-skill-policy.js +62 -0
  455. package/dist/cli/workspacify.js +36 -0
  456. package/dist/client/AgentPanel.d.ts +14 -2
  457. package/dist/client/AgentPanel.js +44 -26
  458. package/dist/client/AssistantChat.js +90 -182
  459. package/dist/client/FeedbackButton.js +15 -2
  460. package/dist/client/RouteTransitionIndicator.d.ts +14 -2
  461. package/dist/client/RouteTransitionIndicator.js +16 -5
  462. package/dist/client/agent-page/AgentTabsPage.js +19 -6
  463. package/dist/client/app-config.d.ts +3 -0
  464. package/dist/client/app-config.js +6 -0
  465. package/dist/client/app-providers.js +2 -1
  466. package/dist/client/changelog/Changelog.d.ts +2 -1
  467. package/dist/client/changelog/Changelog.js +7 -5
  468. package/dist/client/chat/markdown-renderer.d.ts +3 -1
  469. package/dist/client/chat/markdown-renderer.js +24 -24
  470. package/dist/client/chat/message-components.d.ts +23 -0
  471. package/dist/client/chat/message-components.js +27 -44
  472. package/dist/client/chat/tool-call-display.d.ts +2 -2
  473. package/dist/client/chat/tool-call-display.js +6 -3
  474. package/dist/client/chat-first/app-open-actions.d.ts +28 -0
  475. package/dist/client/chat-first/app-open-actions.js +25 -0
  476. package/dist/client/chat-first/index.d.ts +1 -0
  477. package/dist/client/chat-first/index.js +1 -0
  478. package/dist/client/chat-first/primary-nav.d.ts +2 -1
  479. package/dist/client/chat-first/primary-nav.js +12 -5
  480. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +14 -0
  481. package/dist/client/conversation/use-near-bottom-autoscroll.js +14 -0
  482. package/dist/client/error-format.js +32 -3
  483. package/dist/client/extensions/EmbeddedExtension.js +1 -0
  484. package/dist/client/extensions/ExtensionViewer.js +3 -1
  485. package/dist/client/extensions/InlineExtensionFrame.js +1 -0
  486. package/dist/client/extensions/iframe-bridge.d.ts +3 -2
  487. package/dist/client/extensions/iframe-bridge.js +4 -2
  488. package/dist/client/i18n.js +28 -5
  489. package/dist/client/integrations/IntegrationConnectionChoice.d.ts +11 -0
  490. package/dist/client/integrations/IntegrationConnectionChoice.js +6 -0
  491. package/dist/client/integrations/IntegrationGrid.d.ts +23 -0
  492. package/dist/client/integrations/IntegrationGrid.js +12 -0
  493. package/dist/client/integrations/IntegrationsPanel.js +92 -26
  494. package/dist/client/integrations/index.d.ts +2 -0
  495. package/dist/client/integrations/index.js +2 -0
  496. package/dist/client/onboarding/FirstRunOnboarding.d.ts +3 -1
  497. package/dist/client/onboarding/FirstRunOnboarding.js +26 -16
  498. package/dist/client/onboarding/first-run-enabled.js +1 -5
  499. package/dist/client/onboarding/first-run-startup-gate.d.ts +5 -0
  500. package/dist/client/onboarding/first-run-startup-gate.js +51 -0
  501. package/dist/client/onboarding/first-run-status.d.ts +7 -0
  502. package/dist/client/onboarding/first-run-status.js +26 -0
  503. package/dist/client/onboarding/index.d.ts +3 -0
  504. package/dist/client/onboarding/index.js +3 -0
  505. package/dist/client/onboarding/use-onboarding.d.ts +1 -0
  506. package/dist/client/onboarding/use-onboarding.js +13 -11
  507. package/dist/client/org/TeamPage.js +174 -28
  508. package/dist/client/org/WorkspaceNotice.js +7 -4
  509. package/dist/client/resources/McpConnectionSuggestion.js +29 -72
  510. package/dist/client/resources/McpIntegrationDialog.d.ts +3 -1
  511. package/dist/client/resources/McpIntegrationDialog.js +176 -51
  512. package/dist/client/resources/index.d.ts +1 -0
  513. package/dist/client/resources/index.js +1 -0
  514. package/dist/client/resources/mcp-integration-catalog.d.ts +8 -0
  515. package/dist/client/resources/mcp-integration-catalog.js +28 -0
  516. package/dist/client/settings/ExtensionsSettingsContent.js +2 -2
  517. package/dist/client/settings/SettingsPanel.d.ts +6 -0
  518. package/dist/client/settings/SettingsPanel.js +21 -8
  519. package/dist/client/settings/SettingsRow.d.ts +3 -1
  520. package/dist/client/settings/SettingsRow.js +4 -2
  521. package/dist/client/settings/SettingsSkeleton.js +5 -3
  522. package/dist/client/settings/SettingsTabsPage.js +2 -2
  523. package/dist/client/settings/UsageSection.d.ts +4 -1
  524. package/dist/client/settings/UsageSection.js +187 -93
  525. package/dist/client/settings/agent-settings-search.js +6 -2
  526. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +1 -1
  527. package/dist/client/setup-connections/useBuilderConnectCardController.js +2 -2
  528. package/dist/client/sharing/ShareButton.d.ts +4 -2
  529. package/dist/client/sharing/ShareButton.js +26 -14
  530. package/dist/client/sharing/ShareDialog.d.ts +1 -1
  531. package/dist/client/sharing/ShareDialog.js +17 -11
  532. package/dist/client/sharing/useShareButtonController.d.ts +2 -1
  533. package/dist/client/sharing/useShareButtonController.js +8 -0
  534. package/dist/client/sharing/useShareDialogController.d.ts +1 -1
  535. package/dist/client/sharing/useShareDialogController.js +2 -1
  536. package/dist/collab/routes.d.ts +1 -1
  537. package/dist/config.d.ts +13 -0
  538. package/dist/config.js +53 -0
  539. package/dist/dashboard-storage/schema.d.ts +2 -2
  540. package/dist/data-programs/schema.d.ts +2 -2
  541. package/dist/extensions/actions.js +2 -1
  542. package/dist/extensions/html-shell.d.ts +2 -2
  543. package/dist/extensions/routes.js +4 -1
  544. package/dist/extensions/schema.d.ts +2 -2
  545. package/dist/file-upload/pre-upload-attachments.js +1 -1
  546. package/dist/framework-tools.js +3 -0
  547. package/dist/history/types.d.ts +1 -1
  548. package/dist/index.d.ts +2 -1
  549. package/dist/index.js +2 -1
  550. package/dist/jobs/background-automation-runner.d.ts +1 -0
  551. package/dist/jobs/background-automation-runner.js +4 -2
  552. package/dist/jobs/frontmatter.d.ts +4 -0
  553. package/dist/jobs/frontmatter.js +16 -0
  554. package/dist/jobs/run-history.js +1 -1
  555. package/dist/jobs/tools.js +9 -5
  556. package/dist/localization/default-messages.d.ts +27 -0
  557. package/dist/localization/default-messages.js +28 -1
  558. package/dist/notifications/routes.d.ts +6 -6
  559. package/dist/onboarding/plugin.js +17 -2
  560. package/dist/org/context.js +16 -0
  561. package/dist/progress/routes.d.ts +1 -1
  562. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  563. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  564. package/dist/review/actions/create-review-comment.js +1 -1
  565. package/dist/review/actions/delete-review-comment.js +4 -1
  566. package/dist/review/actions/list-review-comments.js +4 -2
  567. package/dist/review/actions/reply-review-comment.js +1 -1
  568. package/dist/review/types.d.ts +1 -1
  569. package/dist/secrets/routes.d.ts +9 -9
  570. package/dist/server/action-discovery.js +29 -0
  571. package/dist/server/agent-chat/plugin-options.d.ts +7 -0
  572. package/dist/server/agent-chat-plugin.d.ts +2 -0
  573. package/dist/server/agent-chat-plugin.js +12 -4
  574. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  575. package/dist/server/auth.js +18 -4
  576. package/dist/server/better-auth-instance.js +8 -1
  577. package/dist/server/builder-browser.js +31 -0
  578. package/dist/server/magic-link-attribution.d.ts +21 -0
  579. package/dist/server/magic-link-attribution.js +115 -0
  580. package/dist/server/onboarding-html.js +1 -1
  581. package/dist/server/realtime-token.d.ts +1 -1
  582. package/dist/server/transcribe-voice.d.ts +1 -1
  583. package/dist/server/workspace-provider-oauth.js +38 -26
  584. package/dist/setup-connections/index.d.ts +1 -1
  585. package/dist/setup-connections/index.js +1 -1
  586. package/dist/shared/first-run-onboarding.d.ts +6 -0
  587. package/dist/shared/first-run-onboarding.js +6 -0
  588. package/dist/sharing/access.d.ts +1 -1
  589. package/dist/sharing/access.js +4 -1
  590. package/dist/sharing/actions/share-resource.d.ts +1 -1
  591. package/dist/sharing/actions/share-resource.js +2 -2
  592. package/dist/sharing/registry.d.ts +2 -2
  593. package/dist/sharing/schema.d.ts +5 -5
  594. package/dist/sharing/schema.js +9 -6
  595. package/dist/styles/agent-native.css +21 -0
  596. package/dist/styles/chat-history-list.css +1 -1
  597. package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +3 -2
  598. package/dist/templates/chat/.agents/skills/context-awareness/SKILL.md +206 -0
  599. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +73 -80
  600. package/dist/templates/chat/.agents/skills/portability/SKILL.md +107 -0
  601. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +339 -0
  602. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +3 -3
  603. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +1 -1
  604. package/dist/templates/chat/.agents/skills/sharing/SKILL.md +1 -0
  605. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +116 -44
  606. package/dist/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  607. package/dist/templates/chat/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  608. package/dist/templates/chat/.agents/skills/workspace-conventions/SKILL.md +93 -0
  609. package/dist/templates/chat/AGENTS.md +4 -5
  610. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +3 -2
  611. package/dist/templates/default/.agents/skills/context-awareness/SKILL.md +206 -0
  612. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +73 -80
  613. package/dist/templates/default/.agents/skills/portability/SKILL.md +107 -0
  614. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +3 -3
  615. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +1 -1
  616. package/dist/templates/default/.agents/skills/sharing/SKILL.md +233 -0
  617. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +116 -44
  618. package/dist/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  619. package/dist/templates/default/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  620. package/dist/templates/default/.agents/skills/workspace-conventions/SKILL.md +93 -0
  621. package/dist/templates/default/AGENTS.md +17 -2
  622. package/dist/templates/default/agent-native.config.ts +6 -0
  623. package/dist/templates/default/app/i18n/ar-SA.ts +2 -0
  624. package/dist/templates/default/app/i18n/de-DE.ts +2 -0
  625. package/dist/templates/default/app/i18n/en-US.ts +3 -1
  626. package/dist/templates/default/app/i18n/es-ES.ts +2 -0
  627. package/dist/templates/default/app/i18n/fr-FR.ts +2 -0
  628. package/dist/templates/default/app/i18n/hi-IN.ts +2 -0
  629. package/dist/templates/default/app/i18n/ja-JP.ts +2 -0
  630. package/dist/templates/default/app/i18n/ko-KR.ts +2 -0
  631. package/dist/templates/default/app/i18n/pt-BR.ts +2 -0
  632. package/dist/templates/default/app/i18n/zh-CN.ts +2 -0
  633. package/dist/templates/default/app/i18n/zh-TW.ts +2 -0
  634. package/dist/templates/headless/.agents/skills/delegate-to-agent/SKILL.md +289 -0
  635. package/dist/templates/headless/.agents/skills/security/SKILL.md +324 -0
  636. package/dist/templates/headless/.agents/skills/storing-data/SKILL.md +178 -0
  637. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +3 -2
  638. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +73 -80
  639. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +3 -3
  640. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +1 -1
  641. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +1 -0
  642. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +116 -44
  643. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  644. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  645. package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +3 -2
  646. package/dist/templates/workspace-core/AGENTS.md +9 -3
  647. package/dist/templates/workspace-root/AGENTS.md +26 -1
  648. package/dist/templates/workspace-root/agent-native.config.ts +8 -0
  649. package/dist/triggers/actions.js +2 -2
  650. package/dist/usage/actions/get-usage-alerts.d.ts +5 -0
  651. package/dist/usage/actions/get-usage-alerts.js +16 -0
  652. package/dist/usage/actions/get-usage-metrics.d.ts +7 -0
  653. package/dist/usage/actions/get-usage-metrics.js +26 -0
  654. package/dist/usage/actions/manage-usage-alert.d.ts +14 -0
  655. package/dist/usage/actions/manage-usage-alert.js +48 -0
  656. package/dist/usage/alerts-store.d.ts +78 -0
  657. package/dist/usage/alerts-store.js +592 -0
  658. package/dist/usage/metrics-store.d.ts +95 -0
  659. package/dist/usage/metrics-store.js +386 -0
  660. package/dist/usage/store.js +10 -0
  661. package/dist/vite/action-types-plugin.js +28 -0
  662. package/dist/vite/agent-native-config-loader.d.ts +6 -0
  663. package/dist/vite/agent-native-config-loader.js +54 -2
  664. package/dist/vite/client.js +11 -5
  665. package/dist/workspace-connections/actions/bulk-update-workspace-user-groups.d.ts +6 -0
  666. package/dist/workspace-connections/actions/bulk-update-workspace-user-groups.js +24 -0
  667. package/dist/workspace-connections/actions/delete-workspace-user-group.d.ts +7 -0
  668. package/dist/workspace-connections/actions/delete-workspace-user-group.js +29 -0
  669. package/dist/workspace-connections/actions/list-workspace-user-groups.d.ts +2 -0
  670. package/dist/workspace-connections/actions/list-workspace-user-groups.js +13 -0
  671. package/dist/workspace-connections/actions/upsert-workspace-user-group.d.ts +6 -0
  672. package/dist/workspace-connections/actions/upsert-workspace-user-group.js +22 -0
  673. package/dist/workspace-connections/credential-key-aliases.d.ts +3 -0
  674. package/dist/workspace-connections/credential-key-aliases.js +31 -0
  675. package/dist/workspace-connections/credentials.js +1 -25
  676. package/dist/workspace-connections/groups.d.ts +32 -0
  677. package/dist/workspace-connections/groups.js +288 -0
  678. package/dist/workspace-connections/index.d.ts +3 -1
  679. package/dist/workspace-connections/index.js +3 -1
  680. package/dist/workspace-connections/store.d.ts +9 -0
  681. package/dist/workspace-connections/store.js +68 -8
  682. package/docs/content/components.mdx +2 -2
  683. package/docs/content/sharing.mdx +2 -1
  684. package/package.json +10 -2
  685. package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +3 -2
  686. package/src/templates/chat/.agents/skills/context-awareness/SKILL.md +206 -0
  687. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +73 -80
  688. package/src/templates/chat/.agents/skills/portability/SKILL.md +107 -0
  689. package/src/templates/chat/.agents/skills/secrets/SKILL.md +339 -0
  690. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +3 -3
  691. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +1 -1
  692. package/src/templates/chat/.agents/skills/sharing/SKILL.md +1 -0
  693. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +116 -44
  694. package/src/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  695. package/src/templates/chat/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  696. package/src/templates/chat/.agents/skills/workspace-conventions/SKILL.md +93 -0
  697. package/src/templates/chat/AGENTS.md +4 -5
  698. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +3 -2
  699. package/src/templates/default/.agents/skills/context-awareness/SKILL.md +206 -0
  700. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +73 -80
  701. package/src/templates/default/.agents/skills/portability/SKILL.md +107 -0
  702. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +3 -3
  703. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +1 -1
  704. package/src/templates/default/.agents/skills/sharing/SKILL.md +233 -0
  705. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +116 -44
  706. package/src/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  707. package/src/templates/default/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  708. package/src/templates/default/.agents/skills/workspace-conventions/SKILL.md +93 -0
  709. package/src/templates/default/AGENTS.md +17 -2
  710. package/src/templates/default/agent-native.config.ts +6 -0
  711. package/src/templates/default/app/i18n/ar-SA.ts +2 -0
  712. package/src/templates/default/app/i18n/de-DE.ts +2 -0
  713. package/src/templates/default/app/i18n/en-US.ts +3 -1
  714. package/src/templates/default/app/i18n/es-ES.ts +2 -0
  715. package/src/templates/default/app/i18n/fr-FR.ts +2 -0
  716. package/src/templates/default/app/i18n/hi-IN.ts +2 -0
  717. package/src/templates/default/app/i18n/ja-JP.ts +2 -0
  718. package/src/templates/default/app/i18n/ko-KR.ts +2 -0
  719. package/src/templates/default/app/i18n/pt-BR.ts +2 -0
  720. package/src/templates/default/app/i18n/zh-CN.ts +2 -0
  721. package/src/templates/default/app/i18n/zh-TW.ts +2 -0
  722. package/src/templates/headless/.agents/skills/delegate-to-agent/SKILL.md +289 -0
  723. package/src/templates/headless/.agents/skills/security/SKILL.md +324 -0
  724. package/src/templates/headless/.agents/skills/storing-data/SKILL.md +178 -0
  725. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +3 -2
  726. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +73 -80
  727. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +3 -3
  728. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +1 -1
  729. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +1 -0
  730. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +116 -44
  731. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +9 -3
  732. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/spreadsheet-source.md +148 -0
  733. package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +3 -2
  734. package/src/templates/workspace-core/AGENTS.md +9 -3
  735. package/src/templates/workspace-root/AGENTS.md +26 -1
  736. package/src/templates/workspace-root/agent-native.config.ts +8 -0
  737. package/corpus/templates/analytics/.agents/skills/capture-learnings/SKILL.md +0 -89
  738. package/corpus/templates/analytics/.agents/skills/create-skill/SKILL.md +0 -195
  739. package/corpus/templates/analytics/.agents/skills/feature-flags/SKILL.md +0 -169
  740. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  741. package/corpus/templates/assets/.agents/skills/capture-learnings/SKILL.md +0 -89
  742. package/corpus/templates/assets/.agents/skills/create-skill/SKILL.md +0 -195
  743. package/corpus/templates/assets/.agents/skills/feature-flags/SKILL.md +0 -169
  744. package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +0 -392
  745. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  746. package/corpus/templates/brain/.agents/skills/capture-learnings/SKILL.md +0 -89
  747. package/corpus/templates/brain/.agents/skills/create-skill/SKILL.md +0 -195
  748. package/corpus/templates/brain/.agents/skills/feature-flags/SKILL.md +0 -169
  749. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  750. package/corpus/templates/calendar/.agents/skills/capture-learnings/SKILL.md +0 -89
  751. package/corpus/templates/calendar/.agents/skills/create-skill/SKILL.md +0 -195
  752. package/corpus/templates/calendar/.agents/skills/feature-flags/SKILL.md +0 -169
  753. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  754. package/corpus/templates/chat/.agents/skills/capture-learnings/SKILL.md +0 -89
  755. package/corpus/templates/chat/.agents/skills/create-skill/SKILL.md +0 -195
  756. package/corpus/templates/chat/.agents/skills/feature-flags/SKILL.md +0 -169
  757. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  758. package/corpus/templates/clips/.agents/skills/capture-learnings/SKILL.md +0 -89
  759. package/corpus/templates/clips/.agents/skills/create-skill/SKILL.md +0 -195
  760. package/corpus/templates/clips/.agents/skills/feature-flags/SKILL.md +0 -169
  761. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  762. package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +0 -89
  763. package/corpus/templates/content/.agents/skills/create-skill/SKILL.md +0 -195
  764. package/corpus/templates/content/.agents/skills/feature-flags/SKILL.md +0 -169
  765. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  766. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  767. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  768. package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +0 -89
  769. package/corpus/templates/design/.agents/skills/create-skill/SKILL.md +0 -195
  770. package/corpus/templates/design/.agents/skills/feature-flags/SKILL.md +0 -169
  771. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  772. package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +0 -89
  773. package/corpus/templates/dispatch/.agents/skills/create-skill/SKILL.md +0 -195
  774. package/corpus/templates/dispatch/.agents/skills/feature-flags/SKILL.md +0 -169
  775. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  776. package/corpus/templates/factory/.agents/skills/capture-learnings/SKILL.md +0 -89
  777. package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +0 -195
  778. package/corpus/templates/factory/.agents/skills/feature-flags/SKILL.md +0 -169
  779. package/corpus/templates/factory/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  780. package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +0 -89
  781. package/corpus/templates/forms/.agents/skills/create-skill/SKILL.md +0 -195
  782. package/corpus/templates/forms/.agents/skills/feature-flags/SKILL.md +0 -169
  783. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  784. package/corpus/templates/macros/.agents/skills/feature-flags/SKILL.md +0 -169
  785. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  786. package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +0 -89
  787. package/corpus/templates/mail/.agents/skills/create-skill/SKILL.md +0 -195
  788. package/corpus/templates/mail/.agents/skills/feature-flags/SKILL.md +0 -169
  789. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  790. package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +0 -89
  791. package/corpus/templates/plan/.agents/skills/create-skill/SKILL.md +0 -195
  792. package/corpus/templates/plan/.agents/skills/feature-flags/SKILL.md +0 -169
  793. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  794. package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +0 -89
  795. package/corpus/templates/slides/.agents/skills/create-skill/SKILL.md +0 -195
  796. package/corpus/templates/slides/.agents/skills/feature-flags/SKILL.md +0 -169
  797. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  798. package/corpus/templates/tasks/.agents/skills/capture-learnings/SKILL.md +0 -89
  799. package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +0 -195
  800. package/corpus/templates/tasks/.agents/skills/feature-flags/SKILL.md +0 -169
  801. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  802. package/dist/templates/chat/.agents/skills/capture-learnings/SKILL.md +0 -89
  803. package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +0 -195
  804. package/dist/templates/chat/.agents/skills/feature-flags/SKILL.md +0 -169
  805. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  806. package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +0 -89
  807. package/dist/templates/default/.agents/skills/create-skill/SKILL.md +0 -195
  808. package/dist/templates/default/.agents/skills/feature-flags/SKILL.md +0 -169
  809. package/dist/templates/default/.agents/skills/integration-webhooks/SKILL.md +0 -364
  810. package/dist/templates/default/.agents/skills/internationalization/SKILL.md +0 -82
  811. package/dist/templates/default/.agents/skills/onboarding/SKILL.md +0 -56
  812. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +0 -392
  813. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  814. package/dist/templates/headless/.agents/skills/feature-flags/SKILL.md +0 -169
  815. package/dist/templates/headless/.agents/skills/integration-webhooks/SKILL.md +0 -364
  816. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +0 -402
  817. package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +0 -4
  818. package/dist/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +0 -90
  819. package/dist/templates/headless/.agents/skills/turn-into-skill/SKILL.md +0 -112
  820. package/dist/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +0 -4
  821. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  822. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +0 -411
  823. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +0 -107
  824. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +0 -176
  825. package/dist/templates/workspace-core/.agents/skills/agent-page/SKILL.md +0 -63
  826. package/dist/templates/workspace-core/.agents/skills/audit-log/SKILL.md +0 -96
  827. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +0 -295
  828. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +0 -242
  829. package/dist/templates/workspace-core/.agents/skills/browser-sessions/SKILL.md +0 -131
  830. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +0 -89
  831. package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +0 -114
  832. package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +0 -115
  833. package/dist/templates/workspace-core/.agents/skills/client-methods/references/legacy-client-fetch-audit-2026-06-03.md +0 -62
  834. package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +0 -87
  835. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +0 -139
  836. package/dist/templates/workspace-core/.agents/skills/context-xray/SKILL.md +0 -72
  837. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +0 -195
  838. package/dist/templates/workspace-core/.agents/skills/data-programs/SKILL.md +0 -128
  839. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +0 -219
  840. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +0 -533
  841. package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +0 -340
  842. package/dist/templates/workspace-core/.agents/skills/extensions/references/examples.md +0 -259
  843. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +0 -547
  844. package/dist/templates/workspace-core/.agents/skills/external-agents/references/mcp-apps-embedding.md +0 -157
  845. package/dist/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +0 -169
  846. package/dist/templates/workspace-core/.agents/skills/generative-ui/SKILL.md +0 -117
  847. package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +0 -170
  848. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +0 -364
  849. package/dist/templates/workspace-core/.agents/skills/internationalization/SKILL.md +0 -82
  850. package/dist/templates/workspace-core/.agents/skills/mvp-followup/SKILL.md +0 -52
  851. package/dist/templates/workspace-core/.agents/skills/native-navigation/SKILL.md +0 -67
  852. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -329
  853. package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +0 -56
  854. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +0 -299
  855. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +0 -333
  856. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +0 -392
  857. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +0 -74
  858. package/dist/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +0 -70
  859. package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +0 -84
  860. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +0 -278
  861. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  862. package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +0 -101
  863. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +0 -222
  864. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +0 -363
  865. package/src/templates/chat/.agents/skills/capture-learnings/SKILL.md +0 -89
  866. package/src/templates/chat/.agents/skills/create-skill/SKILL.md +0 -195
  867. package/src/templates/chat/.agents/skills/feature-flags/SKILL.md +0 -169
  868. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  869. package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +0 -89
  870. package/src/templates/default/.agents/skills/create-skill/SKILL.md +0 -195
  871. package/src/templates/default/.agents/skills/feature-flags/SKILL.md +0 -169
  872. package/src/templates/default/.agents/skills/integration-webhooks/SKILL.md +0 -364
  873. package/src/templates/default/.agents/skills/internationalization/SKILL.md +0 -82
  874. package/src/templates/default/.agents/skills/onboarding/SKILL.md +0 -56
  875. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +0 -392
  876. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  877. package/src/templates/headless/.agents/skills/feature-flags/SKILL.md +0 -169
  878. package/src/templates/headless/.agents/skills/integration-webhooks/SKILL.md +0 -364
  879. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +0 -402
  880. package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +0 -4
  881. package/src/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +0 -90
  882. package/src/templates/headless/.agents/skills/turn-into-skill/SKILL.md +0 -112
  883. package/src/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +0 -4
  884. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  885. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +0 -411
  886. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +0 -107
  887. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +0 -176
  888. package/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +0 -63
  889. package/src/templates/workspace-core/.agents/skills/audit-log/SKILL.md +0 -96
  890. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +0 -295
  891. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +0 -242
  892. package/src/templates/workspace-core/.agents/skills/browser-sessions/SKILL.md +0 -131
  893. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +0 -89
  894. package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +0 -114
  895. package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +0 -115
  896. package/src/templates/workspace-core/.agents/skills/client-methods/references/legacy-client-fetch-audit-2026-06-03.md +0 -62
  897. package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +0 -87
  898. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +0 -139
  899. package/src/templates/workspace-core/.agents/skills/context-xray/SKILL.md +0 -72
  900. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +0 -195
  901. package/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +0 -128
  902. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +0 -219
  903. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +0 -533
  904. package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +0 -340
  905. package/src/templates/workspace-core/.agents/skills/extensions/references/examples.md +0 -259
  906. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +0 -547
  907. package/src/templates/workspace-core/.agents/skills/external-agents/references/mcp-apps-embedding.md +0 -157
  908. package/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +0 -169
  909. package/src/templates/workspace-core/.agents/skills/generative-ui/SKILL.md +0 -117
  910. package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +0 -170
  911. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +0 -364
  912. package/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +0 -82
  913. package/src/templates/workspace-core/.agents/skills/mvp-followup/SKILL.md +0 -52
  914. package/src/templates/workspace-core/.agents/skills/native-navigation/SKILL.md +0 -67
  915. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -329
  916. package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +0 -56
  917. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +0 -299
  918. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +0 -333
  919. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +0 -392
  920. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +0 -74
  921. package/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +0 -70
  922. package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +0 -84
  923. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +0 -278
  924. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +0 -127
  925. package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +0 -101
  926. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +0 -222
  927. 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,10 +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>
1283
- <p className="text-sm text-muted-foreground">
1284
- {t("factoryRoute.rulesDescription")}
1285
- </p>
1516
+ <CardTitle className="text-base">
1517
+ {t("factoryRoute.rulesTitle")}
1518
+ </CardTitle>
1286
1519
  </CardHeader>
1287
1520
  <CardContent className="space-y-2">
1288
1521
  <Button
@@ -1305,7 +1538,9 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1305
1538
  onClick={() => selectRule(rule)}
1306
1539
  >
1307
1540
  <span className="min-w-0 truncate">{rule.name}</span>
1308
- <span className="text-xs text-muted-foreground">Shadow</span>
1541
+ <span className="text-xs text-muted-foreground">
1542
+ {t("factoryRoute.shadowLabel")}
1543
+ </span>
1309
1544
  </Button>
1310
1545
  ))}
1311
1546
  </CardContent>
@@ -1317,13 +1552,15 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1317
1552
  {t("factoryRoute.editRule")}
1318
1553
  </CardTitle>
1319
1554
  <p className="mt-1 text-sm text-muted-foreground">
1320
- Use prompts for classification; keep safety in structured guards.
1555
+ {t("factoryRoute.rulesGuidance")}
1321
1556
  </p>
1322
1557
  </div>
1323
1558
  </CardHeader>
1324
1559
  <CardContent className="space-y-4">
1325
1560
  <div className="grid gap-1.5">
1326
- <Label htmlFor="factory-rule-name">Name</Label>
1561
+ <Label htmlFor="factory-rule-name">
1562
+ {t("factoryRoute.ruleNameLabel")}
1563
+ </Label>
1327
1564
  <Input
1328
1565
  id="factory-rule-name"
1329
1566
  value={name}
@@ -1361,7 +1598,7 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1361
1598
  disabled={!name.trim() || !prompt.trim() || saveMutation.isPending}
1362
1599
  >
1363
1600
  {saveMutation.isPending && <IconLoader2 className="animate-spin" />}
1364
- Save rule
1601
+ {t("factoryRoute.saveRule")}
1365
1602
  </Button>
1366
1603
  </CardContent>
1367
1604
  </Card>
@@ -1370,18 +1607,6 @@ function RulesView({ t }: { t: ReturnType<typeof useT> }) {
1370
1607
  }
1371
1608
 
1372
1609
  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
1610
  const [automationFailureAlertsEnabled, setAutomationFailureAlertsEnabled] =
1386
1611
  useState(true);
1387
1612
  const [automationFailureAlertEmail, setAutomationFailureAlertEmail] =
@@ -1393,219 +1618,125 @@ function SettingsView({ t }: { t: ReturnType<typeof useT> }) {
1393
1618
  { refetchInterval: 60_000 },
1394
1619
  );
1395
1620
  const mutation = useActionMutation("save-triage-config");
1621
+
1396
1622
  useEffect(() => {
1397
1623
  const data = query.data as TriageConfig | undefined;
1398
1624
  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
1625
  setAutomationFailureAlertsEnabled(
1410
1626
  data.automationFailureAlertsEnabled ?? true,
1411
1627
  );
1412
1628
  setAutomationFailureAlertEmail(data.automationFailureAlertEmail ?? "");
1413
1629
  }, [query.data]);
1630
+
1631
+ const saveSettings = () => {
1632
+ mutation.mutate({
1633
+ automationFailureAlertsEnabled,
1634
+ ...(automationFailureAlertEmail.trim()
1635
+ ? { automationFailureAlertEmail: automationFailureAlertEmail.trim() }
1636
+ : {}),
1637
+ });
1638
+ };
1639
+
1640
+ if (query.isLoading) {
1641
+ return (
1642
+ <div className="mx-auto w-full max-w-3xl space-y-6 p-4 lg:p-6">
1643
+ <FactorySettingsSkeleton t={t} />
1644
+ </div>
1645
+ );
1646
+ }
1647
+
1414
1648
  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")
1649
+ <div className="mx-auto w-full max-w-3xl space-y-6 p-4 lg:p-6">
1650
+ <SettingsGroup variant="soft">
1651
+ <SettingsRow
1652
+ label={t("factoryRoute.workspaceIntegrations")}
1653
+ description={t("settings.workspaceDescription")}
1654
+ control={
1655
+ <Button asChild type="button" variant="outline">
1656
+ <Link to={buildSettingsRoute("integrations")}>Manage</Link>
1657
+ </Button>
1658
+ }
1659
+ />
1660
+ <SettingsRow
1661
+ label={t("factoryRoute.agentAccess")}
1662
+ description={t("settings.agentDescription")}
1663
+ control={
1664
+ <Button asChild type="button" variant="outline">
1665
+ <Link to={buildSettingsRoute("agent")}>Manage</Link>
1666
+ </Button>
1667
+ }
1668
+ />
1669
+ </SettingsGroup>
1670
+
1671
+ <SettingsGroup variant="soft">
1672
+ <SettingsRow
1673
+ label={t("factoryRoute.automationFailureAlertsTitle")}
1674
+ description={t("factoryRoute.automationFailureAlertsDescription")}
1675
+ control={
1676
+ <Switch
1677
+ aria-label={t("factoryRoute.automationFailureAlertsEnabled")}
1678
+ checked={automationFailureAlertsEnabled}
1679
+ onCheckedChange={(checked) =>
1680
+ setAutomationFailureAlertsEnabled(checked === true)
1435
1681
  }
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
1682
  />
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>
1683
+ }
1684
+ />
1685
+ <SettingsRow
1686
+ label={t("factoryRoute.automationFailureAlertEmail")}
1687
+ description={t("factoryRoute.automationFailureAlertEmailPlaceholder")}
1688
+ control={
1513
1689
  <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)}
1690
+ aria-label={t("factoryRoute.automationFailureAlertEmail")}
1691
+ type="email"
1692
+ value={automationFailureAlertEmail}
1693
+ onChange={(event) =>
1694
+ setAutomationFailureAlertEmail(event.target.value)
1695
+ }
1696
+ placeholder={t(
1697
+ "factoryRoute.automationFailureAlertEmailPlaceholder",
1698
+ )}
1699
+ className="h-9 w-full sm:w-64"
1524
1700
  />
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")}:{" "}
1701
+ }
1702
+ />
1703
+ <SettingsRow
1704
+ label={t("factoryRoute.automationFailureEmailReadiness")}
1705
+ description={t("factoryRoute.automationEmailReadinessHint")}
1706
+ control={
1707
+ <span className="rounded-full bg-muted px-2.5 py-1 text-xs font-medium text-muted-foreground">
1563
1708
  {(query.data as TriageConfig | undefined)?.emailReadiness
1564
1709
  ?.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>
1710
+ </span>
1711
+ }
1712
+ />
1713
+ {query.isError && (
1714
+ <div className="px-5 py-3 text-xs text-destructive sm:px-6">
1715
+ {t("factoryRoute.automationDiagnosticsLoadError")}{" "}
1716
+ {query.error instanceof Error
1717
+ ? query.error.message
1718
+ : String(query.error)}
1606
1719
  </div>
1607
- </CardContent>
1608
- </Card>
1720
+ )}
1721
+ </SettingsGroup>
1722
+
1723
+ <div className="flex flex-wrap items-center justify-end gap-3">
1724
+ {mutation.isError && (
1725
+ <p className="text-sm text-destructive" role="alert">
1726
+ {t("triage.settingsError")}
1727
+ </p>
1728
+ )}
1729
+ {mutation.isSuccess && (
1730
+ <p className="text-sm text-muted-foreground" role="status">
1731
+ {t("triage.settingsSaved")}
1732
+ </p>
1733
+ )}
1734
+ <Button onClick={saveSettings} disabled={mutation.isPending}>
1735
+ {mutation.isPending && <IconLoader2 className="animate-spin" />}
1736
+ {t("triage.saveSettings")}
1737
+ </Button>
1738
+ </div>
1739
+
1609
1740
  <SchedulerHealthStatus
1610
1741
  health={schedulerHealthQuery.data}
1611
1742
  isError={schedulerHealthQuery.isError}
@@ -1616,6 +1747,27 @@ function SettingsView({ t }: { t: ReturnType<typeof useT> }) {
1616
1747
  );
1617
1748
  }
1618
1749
 
1750
+ function FactorySettingsSkeleton({ t }: { t: ReturnType<typeof useT> }) {
1751
+ return (
1752
+ <div className="space-y-6" aria-label={t("triage.loading")}>
1753
+ {Array.from({ length: 2 }).map((_, index) => (
1754
+ <div key={index} className="grid gap-2">
1755
+ <div className="grid gap-2">
1756
+ {Array.from({ length: index === 0 ? 5 : 3 }).map((_, rowIndex) => (
1757
+ <div
1758
+ key={rowIndex}
1759
+ className="flex min-h-20 items-center justify-between gap-4 rounded-xl bg-card px-5 py-4 shadow-sm sm:px-6"
1760
+ >
1761
+ <div className="h-3.5 w-36 animate-pulse rounded bg-muted" />
1762
+ <div className="h-9 w-24 animate-pulse rounded bg-muted" />
1763
+ </div>
1764
+ ))}
1765
+ </div>
1766
+ </div>
1767
+ ))}
1768
+ </div>
1769
+ );
1770
+ }
1619
1771
  function SchedulerHealthStatus({
1620
1772
  health,
1621
1773
  isError,
@@ -1641,72 +1793,44 @@ function SchedulerHealthStatus({
1641
1793
  !isError &&
1642
1794
  (!health || health.status === "no-data") &&
1643
1795
  !health?.lastCheckedAt;
1644
- const hasDiagnostics =
1645
- isError ||
1646
- hasNoHeartbeat ||
1647
- health?.status === "stale" ||
1648
- health?.status === "error" ||
1649
- Boolean(health?.lastError);
1796
+ const healthDescription = isError
1797
+ ? `${t("factoryRoute.automationDiagnosticsLoadError")} ${error instanceof Error ? error.message : String(error)}`
1798
+ : health?.lastError
1799
+ ? `${t("factoryRoute.automationHealthErrorDetail")}: ${health.lastError}`
1800
+ : health?.status === "stale"
1801
+ ? t("factoryRoute.automationHealthStaleHint")
1802
+ : hasNoHeartbeat
1803
+ ? t("factoryRoute.automationHealthNoDataHint")
1804
+ : undefined;
1650
1805
 
1651
1806
  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)}
1807
+ <SettingsGroup variant="soft">
1808
+ <SettingsRow
1809
+ label={t("factoryRoute.automationHealthTitle")}
1810
+ description={
1811
+ healthDescription ?? t("factoryRoute.automationHealthDescription")
1812
+ }
1813
+ control={
1814
+ <div className="flex flex-wrap items-center justify-end gap-x-4 gap-y-1">
1815
+ <span className="rounded-full bg-muted px-2.5 py-1 text-xs font-medium">
1816
+ {healthLabel}
1679
1817
  </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>
1818
+ {health?.lastCheckedAt && (
1819
+ <span className="text-xs text-muted-foreground">
1820
+ {t("factoryRoute.automationLastCheck")}:{" "}
1821
+ {formatAutomationDate(health.lastCheckedAt)}
1822
+ </span>
1823
+ )}
1824
+ {health?.lastDispatchedAt && (
1825
+ <span className="text-xs text-muted-foreground">
1826
+ {t("factoryRoute.automationLastDispatch")}:{" "}
1827
+ {formatAutomationDate(health.lastDispatchedAt)}
1828
+ </span>
1829
+ )}
1830
+ </div>
1831
+ }
1832
+ />
1833
+ </SettingsGroup>
1710
1834
  );
1711
1835
  }
1712
1836