@agent-native/core 0.137.2 → 0.137.4

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 (176) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  3. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +53 -1
  4. package/corpus/templates/analytics/actions/gong-calls.ts +37 -17
  5. package/corpus/templates/analytics/app/lib/data-sources.ts +1 -1
  6. package/corpus/templates/analytics/server/lib/gong.ts +51 -2
  7. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  8. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +53 -1
  9. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  10. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +53 -1
  11. package/corpus/templates/brain/app/routes/settings.tsx +1 -1
  12. package/corpus/templates/brain/server/register-secrets.ts +1 -1
  13. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  14. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +53 -1
  15. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  16. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +53 -1
  17. package/corpus/templates/chat/AGENTS.md +11 -0
  18. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  19. package/corpus/templates/chat/app/root.tsx +1 -1
  20. package/corpus/templates/chat/app/routes/agent.tsx +29 -13
  21. package/corpus/templates/chat/vite.config.ts +42 -0
  22. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  23. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +53 -1
  24. package/corpus/templates/clips/app/components/library/empty-state.tsx +1 -3
  25. package/corpus/templates/clips/app/components/library/library-grid.tsx +2 -6
  26. package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -6
  27. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +1 -3
  28. package/corpus/templates/clips/app/routes/bug-report.tsx +1 -8
  29. package/corpus/templates/clips/app/routes/import.tsx +1 -3
  30. package/corpus/templates/clips/changelog/2026-08-04-recording-buttons-are-now-text-only-for-a-cleaner-clips-inte.md +6 -0
  31. package/corpus/templates/clips/changelog/2026-08-04-save-settings-now-matches-the-other-clips-settings-buttons.md +6 -0
  32. package/corpus/templates/clips/chrome-extension/src/styles.css +1 -0
  33. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  34. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +53 -1
  35. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  36. package/corpus/templates/crm/app/routes/settings.tsx +2 -2
  37. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  38. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +53 -1
  39. package/corpus/templates/design/actions/import-figma-clipboard.ts +1 -1
  40. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  41. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +53 -1
  42. package/corpus/templates/dispatch/changelog/2026-08-04-dispatch-keeps-connected-chats-out-of-local-history-by-defau.md +6 -0
  43. package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  44. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +53 -1
  45. package/corpus/templates/factory/README.md +1 -1
  46. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  47. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +53 -1
  48. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  49. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +53 -1
  50. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  51. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +53 -1
  52. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +0 -2
  53. package/corpus/templates/mail/app/pages/SettingsPage.tsx +1 -1
  54. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  55. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +53 -1
  56. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  57. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +53 -1
  58. package/corpus/templates/slides/actions/generate-image-api.ts +15 -4
  59. package/corpus/templates/slides/actions/import-google-slides-reference.ts +83 -0
  60. package/corpus/templates/slides/actions/import-pptx.ts +134 -117
  61. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +387 -0
  62. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +78 -48
  63. package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +377 -187
  64. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +0 -1
  65. package/corpus/templates/slides/app/hooks/use-deck-design-system.ts +20 -1
  66. package/corpus/templates/slides/app/i18n/en-US.ts +15 -0
  67. package/corpus/templates/slides/app/lib/new-deck-reference-selection.ts +22 -0
  68. package/corpus/templates/slides/app/pages/DeckEditor.tsx +4 -1
  69. package/corpus/templates/slides/app/pages/Index.tsx +172 -85
  70. package/corpus/templates/slides/server/lib/assets-image-delegation.ts +4 -2
  71. package/corpus/templates/slides/shared/api.ts +14 -1
  72. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  73. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +53 -1
  74. package/dist/chat-threads/schema.d.ts +57 -0
  75. package/dist/chat-threads/schema.js +3 -0
  76. package/dist/chat-threads/store.d.ts +26 -0
  77. package/dist/chat-threads/store.js +84 -6
  78. package/dist/client/AgentPanel.js +11 -5
  79. package/dist/client/ConnectBuilderCard.js +1 -1
  80. package/dist/client/agent-page/AgentEmptyState.d.ts +2 -1
  81. package/dist/client/agent-page/AgentEmptyState.js +6 -2
  82. package/dist/client/agent-page/AgentJobsTab.d.ts +3 -1
  83. package/dist/client/agent-page/AgentJobsTab.js +55 -44
  84. package/dist/client/agent-page/AgentTabFrame.d.ts +2 -1
  85. package/dist/client/agent-page/AgentTabFrame.js +4 -2
  86. package/dist/client/agent-page/AgentTabsPage.js +12 -8
  87. package/dist/client/agent-page/AgentWorkspaceContent.d.ts +10 -0
  88. package/dist/client/agent-page/AgentWorkspaceContent.js +110 -0
  89. package/dist/client/agent-page/AutomationDetailsDialog.js +1 -1
  90. package/dist/client/chat/run-recovery.js +3 -3
  91. package/dist/client/error-format.js +1 -1
  92. package/dist/client/integrations/IntegrationsPanel.d.ts +1 -0
  93. package/dist/client/integrations/IntegrationsPanel.js +149 -5
  94. package/dist/client/onboarding/FirstRunOnboarding.js +130 -15
  95. package/dist/client/onboarding/index.d.ts +1 -1
  96. package/dist/client/onboarding/index.js +1 -1
  97. package/dist/client/onboarding/use-onboarding.js +12 -2
  98. package/dist/client/onboarding/use-preview-mode.d.ts +4 -0
  99. package/dist/client/onboarding/use-preview-mode.js +9 -0
  100. package/dist/client/resources/BuiltinCapabilityDetail.js +2 -2
  101. package/dist/client/resources/ResourceTree.d.ts +4 -1
  102. package/dist/client/resources/ResourceTree.js +13 -8
  103. package/dist/client/resources/ResourcesPanel.js +7 -3
  104. package/dist/client/resources/mcp-integration-catalog.js +4 -4
  105. package/dist/client/resources/use-mcp-servers.js +6 -6
  106. package/dist/client/settings/AgentsSection.js +15 -16
  107. package/dist/client/settings/AutomationsSection.js +1 -1
  108. package/dist/client/settings/DemoModeSection.js +1 -1
  109. package/dist/client/settings/SettingsPanel.d.ts +3 -1
  110. package/dist/client/settings/SettingsPanel.js +284 -88
  111. package/dist/client/settings/SettingsRow.js +1 -1
  112. package/dist/client/settings/SettingsSection.d.ts +6 -4
  113. package/dist/client/settings/SettingsSection.js +6 -6
  114. package/dist/client/settings/SettingsTabsPage.js +47 -25
  115. package/dist/client/settings/VoiceTranscriptionSection.d.ts +3 -1
  116. package/dist/client/settings/VoiceTranscriptionSection.js +20 -8
  117. package/dist/client/settings/agent-settings-search.d.ts +1 -1
  118. package/dist/client/settings/agent-settings-search.js +8 -8
  119. package/dist/client/transcription/BuilderTranscriptionCta.js +2 -2
  120. package/dist/client/use-chat-threads.d.ts +9 -0
  121. package/dist/client/use-chat-threads.js +22 -6
  122. package/dist/collab/routes.d.ts +1 -1
  123. package/dist/integrations/google-docs-poller.js +9 -1
  124. package/dist/integrations/webhook-handler.js +11 -1
  125. package/dist/jobs/scheduler.d.ts +4 -1
  126. package/dist/jobs/scheduler.js +34 -9
  127. package/dist/localization/default-messages.js +40 -40
  128. package/dist/mcp-client/oauth-routes.js +1 -1
  129. package/dist/notifications/routes.d.ts +1 -1
  130. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  131. package/dist/provider-api/actions/provider-api.d.ts +15 -15
  132. package/dist/resources/handlers.d.ts +1 -1
  133. package/dist/secrets/onboarding.js +1 -1
  134. package/dist/secrets/routes.d.ts +9 -9
  135. package/dist/server/agent-chat/browser-team-tools.d.ts +1 -0
  136. package/dist/server/agent-chat/browser-team-tools.js +1 -0
  137. package/dist/server/agent-chat-plugin.js +14 -1
  138. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  139. package/dist/server/agent-teams.d.ts +2 -0
  140. package/dist/server/agent-teams.js +2 -0
  141. package/dist/server/workspace-provider-oauth.js +1 -1
  142. package/dist/setup-connections/onboarding.js +2 -2
  143. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  144. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +53 -1
  145. package/dist/templates/chat/AGENTS.md +11 -0
  146. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
  147. package/dist/templates/chat/app/root.tsx +1 -1
  148. package/dist/templates/chat/app/routes/agent.tsx +29 -13
  149. package/dist/templates/chat/vite.config.ts +42 -0
  150. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  151. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +53 -1
  152. package/dist/templates/default/AGENTS.md +11 -0
  153. package/dist/templates/default/vite.config.ts +42 -0
  154. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  155. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  156. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +53 -1
  157. package/dist/templates/workspace-core/AGENTS.md +11 -0
  158. package/dist/templates/workspace-root/AGENTS.md +14 -0
  159. package/dist/vite/client.js +56 -0
  160. package/package.json +2 -2
  161. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  162. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +53 -1
  163. package/src/templates/chat/AGENTS.md +11 -0
  164. package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
  165. package/src/templates/chat/app/root.tsx +1 -1
  166. package/src/templates/chat/app/routes/agent.tsx +29 -13
  167. package/src/templates/chat/vite.config.ts +42 -0
  168. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  169. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +53 -1
  170. package/src/templates/default/AGENTS.md +11 -0
  171. package/src/templates/default/vite.config.ts +42 -0
  172. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  173. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +33 -0
  174. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +53 -1
  175. package/src/templates/workspace-core/AGENTS.md +11 -0
  176. package/src/templates/workspace-root/AGENTS.md +14 -0
@@ -77,7 +77,10 @@ passed this requirement yet.
77
77
 
78
78
  ## Aesthetic Guidelines
79
79
 
80
- - **Typography**: Use the product's existing type system first. For net-new public pages, choose characterful but readable type and keep sizing appropriate to the surface.
80
+ - **Typography**: Use the product's existing type system first. For SaaS and
81
+ operational apps, make a clear sans-serif hierarchy the default; reserve a
82
+ serif or editorial face for a deliberate content preview or brand moment,
83
+ not the whole application shell.
81
84
  - **Color and theme**: Use semantic tokens and CSS variables. Avoid one-note palettes and default purple/blue gradients unless the brand demands them.
82
85
  - **Motion**: Prefer purposeful transitions and small state changes. Use CSS transitions/keyframes unless the app already uses a motion library. Never `transition-all` — list the properties that actually change (e.g. `transition-[opacity,transform]`). Use the shared easing tokens defined in `packages/core/src/styles/agent-native.css` instead of hand-typing curves: `var(--ease-drawer)` (260ms, drawers/app chrome), `var(--ease-collapse)` (200ms, expand/collapse), `var(--ease-out-strong)` (snappy entrances) — in Tailwind, `ease-[var(--ease-collapse)]`. Enter/exit with ease-out, never `ease-in`. Overlays that zoom in must set the Radix origin var (e.g. `origin-[--radix-popover-content-transform-origin]`). Animate `transform`/`opacity`, not width/height/padding/box-shadow. Gate looping or large-movement animations with `motion-reduce:`. Command palettes and keyboard-triggered actions get no animation.
83
86
  - **Composition**: Match the workflow. Operational apps should be dense and scannable; marketing or portfolio pages can be more immersive.
@@ -115,6 +118,55 @@ passed this requirement yet.
115
118
  - Keep UI optimistic where possible: update cache and navigation immediately, then reconcile or roll back on mutation result.
116
119
  - Custom styles belong in Tailwind classes, component CSS, or the existing global CSS theme file; avoid inline styles.
117
120
 
121
+ ### Agent Surface And Page Boundaries
122
+
123
+ - Treat the domain UI and the agent as two coordinated surfaces. The domain
124
+ page should make the repeatable job fast; the agent should handle judgment,
125
+ exploration, and actions that benefit from conversation.
126
+ - Keep domain work on a named domain route such as `/automations`, `/block`, or
127
+ `/workflow`. Preserve the starter's full-page chat route (`/` or `/chat/*`)
128
+ when it exists; do not replace it with a domain form while leaving the shell
129
+ configured as if it were chat.
130
+ - Use the persistent right `AgentSidebar` for contextual AI. A button that
131
+ sends work to `sendToAgentChat` must open or focus that sidebar and leave the
132
+ user on the current domain surface. Use full-page chat for chat-first work,
133
+ not as a hidden transport for a domain button.
134
+ - Keep the left navigation domain-specific. A page called Automations,
135
+ Block time, or Create deck should not be nested under a generic Chat item;
136
+ Chat is its own destination and the right rail is the contextual assistant.
137
+ - Never use sparkle, wand, magic, robot, or similar decorative AI icons. Use a
138
+ familiar message, assistant, or neutral action icon, and let the button copy
139
+ explain the intent. An icon-only control needs a tooltip and accessible name.
140
+ - Give the persistent agent drawer a quiet but intentional boundary: a subtle
141
+ surface shift, divider, or both. The sidebar and domain page should not read
142
+ as one undifferentiated slab, and the treatment should remain calm when the
143
+ drawer opens or closes.
144
+ - Treat an AI-labeled button as a contract. Buttons named Ask agent, Review
145
+ with agent, Refine, Generate with AI, or similar must call
146
+ `sendToAgentChat` with bounded context, `openSidebar: true`, and the intended
147
+ `submit` mode. A deterministic local action is useful, but label it local,
148
+ preview, or analyze rather than implying it invoked an agent.
149
+
150
+ ### Product Surface Review
151
+
152
+ Before shipping a new app or a substantial redesign, review the first viewport
153
+ as an operator would use it repeatedly:
154
+
155
+ - Show one clear job title, the current state, and one primary next action.
156
+ - Put optional inputs, provider choices, diagnostics, long explanations, and
157
+ secondary actions behind a disclosure, a later step, a menu, or the agent
158
+ sidebar. Do not put multiple unrelated forms side by side by default.
159
+ - Prefer a short step flow or a focused page per domain job over one giant
160
+ dashboard. A route can have several states, but it should reveal one state
161
+ at a time and preserve the user's progress.
162
+ - Remove generic hero copy, feature tours, repeated helper text, nested cards,
163
+ status-chip soup, and decorative AI treatment before adding more styling.
164
+ - For review flows, stack the source/original first and the generated or safe
165
+ result second by default. Use side-by-side comparison only when the content
166
+ is short enough to scan without excessive horizontal reading.
167
+ - Check the result at the target desktop width and a narrow width. If the first
168
+ viewport feels like documentation instead of a tool, subtract again.
169
+
118
170
  ## shadcn/ui Design Rules
119
171
 
120
172
  - Use built-in component variants first (`variant`, `size`) before overriding classes.
@@ -32,6 +32,39 @@ Move behavior into shared toolkit primitives when it is:
32
32
  Keep behavior app-local when the abstraction would hide important domain
33
33
  language or make a simple app-specific workflow harder to understand.
34
34
 
35
+ ## Agent Surface Contract
36
+
37
+ The repeated app shell has two distinct navigation surfaces:
38
+
39
+ - The left rail owns domain destinations, settings, and chat history when the
40
+ app has a full-page chat route. Do not label a domain workflow as `Chat` just
41
+ because the app was scaffolded from the chat template.
42
+ - The right `AgentSidebar` owns contextual agent work. Domain buttons that call
43
+ `sendToAgentChat` should open it (`openSidebar: true`) so the user can see,
44
+ steer, and review the agent without losing the page they were using.
45
+ - Keep `/` or `/chat/*` as the full-page chat surface when the starter provides
46
+ one. Put domain workflows on named routes and wire the shell's route checks,
47
+ navigation labels, and handoffs to those routes together.
48
+ - Use familiar message or neutral action icons for agent affordances. Never use
49
+ sparkle, wand, magic, or robot icons as an AI label; the copy should carry the
50
+ meaning.
51
+ - Give the right rail a quiet visual boundary with a subtle surface shift,
52
+ divider, or both. The domain page and AgentSidebar should not collapse into a
53
+ single undifferentiated background.
54
+ - Any button labeled as agent work must use `sendToAgentChat` with bounded
55
+ context and `openSidebar: true`; local deterministic analysis should be
56
+ labeled as local, preview, or analyze. For original/generated review, stack
57
+ the source above the result by default and use side-by-side only for short,
58
+ highly scannable content.
59
+ - Standalone apps with `AgentSidebar` must resolve one assistant-ui runtime
60
+ context. Match direct assistant-ui pins to the installed core/toolkit peer
61
+ graph, use Vite dedupe/aliases when linked dependencies can split contexts,
62
+ and verify an AI handoff produces no stale-index console error.
63
+
64
+ Contextual agent UI is not a reason to expose every option at once. Start with
65
+ the domain task's primary action, reveal review or configuration only when the
66
+ current state needs it, and let the sidebar carry conversational depth.
67
+
35
68
  ## Discover Before Building
36
69
 
37
70
  Before creating an app-local version of repeated workspace or agent UI:
@@ -77,7 +77,10 @@ passed this requirement yet.
77
77
 
78
78
  ## Aesthetic Guidelines
79
79
 
80
- - **Typography**: Use the product's existing type system first. For net-new public pages, choose characterful but readable type and keep sizing appropriate to the surface.
80
+ - **Typography**: Use the product's existing type system first. For SaaS and
81
+ operational apps, make a clear sans-serif hierarchy the default; reserve a
82
+ serif or editorial face for a deliberate content preview or brand moment,
83
+ not the whole application shell.
81
84
  - **Color and theme**: Use semantic tokens and CSS variables. Avoid one-note palettes and default purple/blue gradients unless the brand demands them.
82
85
  - **Motion**: Prefer purposeful transitions and small state changes. Use CSS transitions/keyframes unless the app already uses a motion library. Never `transition-all` — list the properties that actually change (e.g. `transition-[opacity,transform]`). Use the shared easing tokens defined in `packages/core/src/styles/agent-native.css` instead of hand-typing curves: `var(--ease-drawer)` (260ms, drawers/app chrome), `var(--ease-collapse)` (200ms, expand/collapse), `var(--ease-out-strong)` (snappy entrances) — in Tailwind, `ease-[var(--ease-collapse)]`. Enter/exit with ease-out, never `ease-in`. Overlays that zoom in must set the Radix origin var (e.g. `origin-[--radix-popover-content-transform-origin]`). Animate `transform`/`opacity`, not width/height/padding/box-shadow. Gate looping or large-movement animations with `motion-reduce:`. Command palettes and keyboard-triggered actions get no animation.
83
86
  - **Composition**: Match the workflow. Operational apps should be dense and scannable; marketing or portfolio pages can be more immersive.
@@ -115,6 +118,55 @@ passed this requirement yet.
115
118
  - Keep UI optimistic where possible: update cache and navigation immediately, then reconcile or roll back on mutation result.
116
119
  - Custom styles belong in Tailwind classes, component CSS, or the existing global CSS theme file; avoid inline styles.
117
120
 
121
+ ### Agent Surface And Page Boundaries
122
+
123
+ - Treat the domain UI and the agent as two coordinated surfaces. The domain
124
+ page should make the repeatable job fast; the agent should handle judgment,
125
+ exploration, and actions that benefit from conversation.
126
+ - Keep domain work on a named domain route such as `/automations`, `/block`, or
127
+ `/workflow`. Preserve the starter's full-page chat route (`/` or `/chat/*`)
128
+ when it exists; do not replace it with a domain form while leaving the shell
129
+ configured as if it were chat.
130
+ - Use the persistent right `AgentSidebar` for contextual AI. A button that
131
+ sends work to `sendToAgentChat` must open or focus that sidebar and leave the
132
+ user on the current domain surface. Use full-page chat for chat-first work,
133
+ not as a hidden transport for a domain button.
134
+ - Keep the left navigation domain-specific. A page called Automations,
135
+ Block time, or Create deck should not be nested under a generic Chat item;
136
+ Chat is its own destination and the right rail is the contextual assistant.
137
+ - Never use sparkle, wand, magic, robot, or similar decorative AI icons. Use a
138
+ familiar message, assistant, or neutral action icon, and let the button copy
139
+ explain the intent. An icon-only control needs a tooltip and accessible name.
140
+ - Give the persistent agent drawer a quiet but intentional boundary: a subtle
141
+ surface shift, divider, or both. The sidebar and domain page should not read
142
+ as one undifferentiated slab, and the treatment should remain calm when the
143
+ drawer opens or closes.
144
+ - Treat an AI-labeled button as a contract. Buttons named Ask agent, Review
145
+ with agent, Refine, Generate with AI, or similar must call
146
+ `sendToAgentChat` with bounded context, `openSidebar: true`, and the intended
147
+ `submit` mode. A deterministic local action is useful, but label it local,
148
+ preview, or analyze rather than implying it invoked an agent.
149
+
150
+ ### Product Surface Review
151
+
152
+ Before shipping a new app or a substantial redesign, review the first viewport
153
+ as an operator would use it repeatedly:
154
+
155
+ - Show one clear job title, the current state, and one primary next action.
156
+ - Put optional inputs, provider choices, diagnostics, long explanations, and
157
+ secondary actions behind a disclosure, a later step, a menu, or the agent
158
+ sidebar. Do not put multiple unrelated forms side by side by default.
159
+ - Prefer a short step flow or a focused page per domain job over one giant
160
+ dashboard. A route can have several states, but it should reveal one state
161
+ at a time and preserve the user's progress.
162
+ - Remove generic hero copy, feature tours, repeated helper text, nested cards,
163
+ status-chip soup, and decorative AI treatment before adding more styling.
164
+ - For review flows, stack the source/original first and the generated or safe
165
+ result second by default. Use side-by-side comparison only when the content
166
+ is short enough to scan without excessive horizontal reading.
167
+ - Check the result at the target desktop width and a narrow width. If the first
168
+ viewport feels like documentation instead of a tool, subtract again.
169
+
118
170
  ## shadcn/ui Design Rules
119
171
 
120
172
  - Use built-in component variants first (`variant`, `size`) before overriding classes.
@@ -13,6 +13,17 @@ workflow needs durable UI around the conversation.
13
13
  - Never hardcode API keys, tokens, webhook URLs, signing secrets, private Builder/internal data, customer data, or credential-looking literals. Use secrets/OAuth/runtime configuration and obvious placeholders in examples.
14
14
  - Follow the root framework contract: data in SQL, actions first, application
15
15
  state for navigation/selection, and shared agent chat for AI work.
16
+ - Keep the full-page chat route distinct from domain pages. If a workflow needs
17
+ a page, give it a named route and use the right AgentSidebar for contextual
18
+ AI; domain buttons that call `sendToAgentChat()` should open that sidebar.
19
+ - Keep the first viewport sparse and task-focused. Use progressive disclosure
20
+ and domain-specific navigation, and never use sparkle, wand, magic, or robot
21
+ icons as AI affordances.
22
+ - Use a sans-first SaaS hierarchy with one restrained visual cue; reserve serif
23
+ type for content previews. Give the AgentSidebar a subtle surface/divider
24
+ boundary, and stack original/generated review vertically by default.
25
+ - Every AI-labeled button must call `sendToAgentChat()` with
26
+ `openSidebar: true`; label deterministic local actions as local or preview.
16
27
  - Scale effort to the task. A small, well-specified change is a short read, the
17
28
  edit, and the app's existing checks (`pnpm typecheck`, formatter, existing
18
29
  tests) — not a codebase survey, unrequested tests, or browser automation.
@@ -172,7 +172,7 @@ export function Layout({ children }: LayoutProps) {
172
172
  openOnChatRunning={chatHomeHandoffActive}
173
173
  onFullscreenRequest={openAskAgentFullscreen}
174
174
  emptyStateText={t("chat.inspectEmptyState")}
175
- agentPageHref="/agent"
175
+ agentPageHref="/settings#agent"
176
176
  suggestions={[
177
177
  t("chat.inspectSuggestionCapabilities"),
178
178
  t("chat.inspectSuggestionHello"),
@@ -133,7 +133,7 @@ function AppContent() {
133
133
  {t("root.commandSearch")}
134
134
  </CommandMenu.Item>
135
135
  <CommandMenu.Item
136
- onSelect={() => navigate("/agent")}
136
+ onSelect={() => navigate("/settings#agent")}
137
137
  keywords={[
138
138
  "agent",
139
139
  "context",
@@ -1,24 +1,40 @@
1
- import {
2
- AgentChatSurface,
3
- AgentTabsPage,
4
- } from "@agent-native/core/client/agent-chat";
5
1
  import { useT } from "@agent-native/core/client/i18n";
6
2
  import { useSetPageTitle } from "@agent-native/toolkit/app-shell";
7
-
8
- import { resolveAgentPageComponent } from "@/lib/agent-page";
9
- import { APP_TITLE } from "@/lib/app-config";
3
+ import { Navigate, useLocation } from "react-router";
10
4
 
11
5
  export function meta() {
12
- return [{ title: `Agent - ${APP_TITLE}` }];
6
+ return [{ title: "Agent settings" }]; // i18n-ignore legacy meta fallback; the client title is localized
13
7
  }
14
8
 
15
9
  export default function AgentRoute() {
16
10
  const t = useT();
11
+ const location = useLocation();
17
12
  useSetPageTitle(t("settings.agentTitle"));
18
13
 
19
- const AgentPage = resolveAgentPageComponent({
20
- AgentChatSurface,
21
- AgentTabsPage,
22
- });
23
- return <AgentPage appName={APP_TITLE} />;
14
+ const legacyTab = location.hash.replace(/^#/, "").toLowerCase();
15
+ const resourceTabs = new Set([
16
+ "files",
17
+ "instructions",
18
+ "agents",
19
+ "memory",
20
+ "skills",
21
+ "learnings",
22
+ ]);
23
+ const destination = resourceTabs.has(legacyTab)
24
+ ? `/settings#agent:resources:${legacyTab}`
25
+ : legacyTab === "remote-agents"
26
+ ? "/settings#agent:agents"
27
+ : legacyTab === "connections"
28
+ ? "/settings#integrations"
29
+ : legacyTab === "jobs"
30
+ ? "/settings#agent:automations"
31
+ : legacyTab === "access"
32
+ ? "/settings#agent:access"
33
+ : ["llm", "app-models", "limits", "voice", "background"].includes(
34
+ legacyTab,
35
+ )
36
+ ? `/settings#${legacyTab}`
37
+ : "/settings#agent";
38
+
39
+ return <Navigate to={destination} replace />;
24
40
  }
@@ -1,3 +1,5 @@
1
+ import { createRequire } from "node:module";
2
+
1
3
  import { agentNative } from "@agent-native/core/vite";
2
4
  import { reactRouter } from "@react-router/dev/vite";
3
5
  import { defineConfig } from "vite";
@@ -6,8 +8,48 @@ const reactRouterPlugins = reactRouter as unknown as () => any[];
6
8
  const agentNativePlugins = agentNative as unknown as (
7
9
  options?: Parameters<typeof agentNative>[0],
8
10
  ) => any[];
11
+ const appRequire = createRequire(import.meta.url);
12
+ const coreRequire = createRequire(
13
+ appRequire.resolve("@agent-native/core/vite"),
14
+ );
9
15
 
10
16
  export default defineConfig({
17
+ resolve: {
18
+ // Core and toolkit both use assistant-ui contexts. Keep published and
19
+ // linked graphs on one store so the agent sidebar can compose reliably.
20
+ dedupe: [
21
+ "@assistant-ui/react",
22
+ "@assistant-ui/core",
23
+ "@assistant-ui/store",
24
+ "@assistant-ui/tap",
25
+ ],
26
+ alias: [
27
+ {
28
+ find: /^@assistant-ui\/react$/,
29
+ replacement: coreRequire.resolve("@assistant-ui/react"),
30
+ },
31
+ {
32
+ find: /^@assistant-ui\/core$/,
33
+ replacement: coreRequire.resolve("@assistant-ui/core"),
34
+ },
35
+ {
36
+ find: /^@assistant-ui\/store$/,
37
+ replacement: coreRequire.resolve("@assistant-ui/store"),
38
+ },
39
+ {
40
+ find: /^@assistant-ui\/tap$/,
41
+ replacement: coreRequire.resolve("@assistant-ui/tap"),
42
+ },
43
+ {
44
+ find: /^assistant-stream$/,
45
+ replacement: coreRequire.resolve("assistant-stream"),
46
+ },
47
+ {
48
+ find: /^assistant-stream\/utils$/,
49
+ replacement: coreRequire.resolve("assistant-stream/utils"),
50
+ },
51
+ ],
52
+ },
11
53
  plugins: [
12
54
  ...reactRouterPlugins(),
13
55
  ...agentNativePlugins({
@@ -32,6 +32,39 @@ Move behavior into shared toolkit primitives when it is:
32
32
  Keep behavior app-local when the abstraction would hide important domain
33
33
  language or make a simple app-specific workflow harder to understand.
34
34
 
35
+ ## Agent Surface Contract
36
+
37
+ The repeated app shell has two distinct navigation surfaces:
38
+
39
+ - The left rail owns domain destinations, settings, and chat history when the
40
+ app has a full-page chat route. Do not label a domain workflow as `Chat` just
41
+ because the app was scaffolded from the chat template.
42
+ - The right `AgentSidebar` owns contextual agent work. Domain buttons that call
43
+ `sendToAgentChat` should open it (`openSidebar: true`) so the user can see,
44
+ steer, and review the agent without losing the page they were using.
45
+ - Keep `/` or `/chat/*` as the full-page chat surface when the starter provides
46
+ one. Put domain workflows on named routes and wire the shell's route checks,
47
+ navigation labels, and handoffs to those routes together.
48
+ - Use familiar message or neutral action icons for agent affordances. Never use
49
+ sparkle, wand, magic, or robot icons as an AI label; the copy should carry the
50
+ meaning.
51
+ - Give the right rail a quiet visual boundary with a subtle surface shift,
52
+ divider, or both. The domain page and AgentSidebar should not collapse into a
53
+ single undifferentiated background.
54
+ - Any button labeled as agent work must use `sendToAgentChat` with bounded
55
+ context and `openSidebar: true`; local deterministic analysis should be
56
+ labeled as local, preview, or analyze. For original/generated review, stack
57
+ the source above the result by default and use side-by-side only for short,
58
+ highly scannable content.
59
+ - Standalone apps with `AgentSidebar` must resolve one assistant-ui runtime
60
+ context. Match direct assistant-ui pins to the installed core/toolkit peer
61
+ graph, use Vite dedupe/aliases when linked dependencies can split contexts,
62
+ and verify an AI handoff produces no stale-index console error.
63
+
64
+ Contextual agent UI is not a reason to expose every option at once. Start with
65
+ the domain task's primary action, reveal review or configuration only when the
66
+ current state needs it, and let the sidebar carry conversational depth.
67
+
35
68
  ## Discover Before Building
36
69
 
37
70
  Before creating an app-local version of repeated workspace or agent UI:
@@ -77,7 +77,10 @@ passed this requirement yet.
77
77
 
78
78
  ## Aesthetic Guidelines
79
79
 
80
- - **Typography**: Use the product's existing type system first. For net-new public pages, choose characterful but readable type and keep sizing appropriate to the surface.
80
+ - **Typography**: Use the product's existing type system first. For SaaS and
81
+ operational apps, make a clear sans-serif hierarchy the default; reserve a
82
+ serif or editorial face for a deliberate content preview or brand moment,
83
+ not the whole application shell.
81
84
  - **Color and theme**: Use semantic tokens and CSS variables. Avoid one-note palettes and default purple/blue gradients unless the brand demands them.
82
85
  - **Motion**: Prefer purposeful transitions and small state changes. Use CSS transitions/keyframes unless the app already uses a motion library. Never `transition-all` — list the properties that actually change (e.g. `transition-[opacity,transform]`). Use the shared easing tokens defined in `packages/core/src/styles/agent-native.css` instead of hand-typing curves: `var(--ease-drawer)` (260ms, drawers/app chrome), `var(--ease-collapse)` (200ms, expand/collapse), `var(--ease-out-strong)` (snappy entrances) — in Tailwind, `ease-[var(--ease-collapse)]`. Enter/exit with ease-out, never `ease-in`. Overlays that zoom in must set the Radix origin var (e.g. `origin-[--radix-popover-content-transform-origin]`). Animate `transform`/`opacity`, not width/height/padding/box-shadow. Gate looping or large-movement animations with `motion-reduce:`. Command palettes and keyboard-triggered actions get no animation.
83
86
  - **Composition**: Match the workflow. Operational apps should be dense and scannable; marketing or portfolio pages can be more immersive.
@@ -115,6 +118,55 @@ passed this requirement yet.
115
118
  - Keep UI optimistic where possible: update cache and navigation immediately, then reconcile or roll back on mutation result.
116
119
  - Custom styles belong in Tailwind classes, component CSS, or the existing global CSS theme file; avoid inline styles.
117
120
 
121
+ ### Agent Surface And Page Boundaries
122
+
123
+ - Treat the domain UI and the agent as two coordinated surfaces. The domain
124
+ page should make the repeatable job fast; the agent should handle judgment,
125
+ exploration, and actions that benefit from conversation.
126
+ - Keep domain work on a named domain route such as `/automations`, `/block`, or
127
+ `/workflow`. Preserve the starter's full-page chat route (`/` or `/chat/*`)
128
+ when it exists; do not replace it with a domain form while leaving the shell
129
+ configured as if it were chat.
130
+ - Use the persistent right `AgentSidebar` for contextual AI. A button that
131
+ sends work to `sendToAgentChat` must open or focus that sidebar and leave the
132
+ user on the current domain surface. Use full-page chat for chat-first work,
133
+ not as a hidden transport for a domain button.
134
+ - Keep the left navigation domain-specific. A page called Automations,
135
+ Block time, or Create deck should not be nested under a generic Chat item;
136
+ Chat is its own destination and the right rail is the contextual assistant.
137
+ - Never use sparkle, wand, magic, robot, or similar decorative AI icons. Use a
138
+ familiar message, assistant, or neutral action icon, and let the button copy
139
+ explain the intent. An icon-only control needs a tooltip and accessible name.
140
+ - Give the persistent agent drawer a quiet but intentional boundary: a subtle
141
+ surface shift, divider, or both. The sidebar and domain page should not read
142
+ as one undifferentiated slab, and the treatment should remain calm when the
143
+ drawer opens or closes.
144
+ - Treat an AI-labeled button as a contract. Buttons named Ask agent, Review
145
+ with agent, Refine, Generate with AI, or similar must call
146
+ `sendToAgentChat` with bounded context, `openSidebar: true`, and the intended
147
+ `submit` mode. A deterministic local action is useful, but label it local,
148
+ preview, or analyze rather than implying it invoked an agent.
149
+
150
+ ### Product Surface Review
151
+
152
+ Before shipping a new app or a substantial redesign, review the first viewport
153
+ as an operator would use it repeatedly:
154
+
155
+ - Show one clear job title, the current state, and one primary next action.
156
+ - Put optional inputs, provider choices, diagnostics, long explanations, and
157
+ secondary actions behind a disclosure, a later step, a menu, or the agent
158
+ sidebar. Do not put multiple unrelated forms side by side by default.
159
+ - Prefer a short step flow or a focused page per domain job over one giant
160
+ dashboard. A route can have several states, but it should reveal one state
161
+ at a time and preserve the user's progress.
162
+ - Remove generic hero copy, feature tours, repeated helper text, nested cards,
163
+ status-chip soup, and decorative AI treatment before adding more styling.
164
+ - For review flows, stack the source/original first and the generated or safe
165
+ result second by default. Use side-by-side comparison only when the content
166
+ is short enough to scan without excessive horizontal reading.
167
+ - Check the result at the target desktop width and a narrow width. If the first
168
+ viewport feels like documentation instead of a tool, subtract again.
169
+
118
170
  ## shadcn/ui Design Rules
119
171
 
120
172
  - Use built-in component variants first (`variant`, `size`) before overriding classes.
@@ -5,7 +5,6 @@ import {
5
5
  IconUsersGroup,
6
6
  IconArchive,
7
7
  IconTrash,
8
- IconPlayerRecord,
9
8
  } from "@tabler/icons-react";
10
9
  import { useNavigate } from "react-router";
11
10
 
@@ -76,10 +75,9 @@ export function EmptyState({
76
75
  {hasCta && (
77
76
  <Button
78
77
  onClick={handleCta}
79
- className="bg-primary text-primary-foreground hover:bg-primary/90 gap-1.5"
78
+ className="bg-primary text-primary-foreground hover:bg-primary/90"
80
79
  size="sm"
81
80
  >
82
- <IconPlayerRecord className="h-4 w-4" />
83
81
  {t(`empty.${kind}.cta`)}
84
82
  </Button>
85
83
  )}
@@ -7,7 +7,6 @@ import {
7
7
  IconAlertTriangle,
8
8
  IconChevronLeft,
9
9
  IconChevronRight,
10
- IconPlayerRecord,
11
10
  } from "@tabler/icons-react";
12
11
  import { useCallback, useEffect, useMemo, useState } from "react";
13
12
  import { NavLink } from "react-router";
@@ -94,11 +93,8 @@ function NewRecordingTile({
94
93
 
95
94
  return (
96
95
  <div className="flex flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-muted/20 p-6 text-center transition-colors hover:border-primary/40 hover:bg-muted/40">
97
- <Button className="w-full max-w-[180px] gap-1.5" size="sm" asChild>
98
- <NavLink to={recordHref}>
99
- <IconPlayerRecord className="h-4 w-4" />
100
- {t("navigation.newRecording")}
101
- </NavLink>
96
+ <Button className="w-full max-w-[180px]" size="sm" asChild>
97
+ <NavLink to={recordHref}>{t("navigation.newRecording")}</NavLink>
102
98
  </Button>
103
99
  <ImportMenu
104
100
  uploadHref={uploadHref}
@@ -436,11 +436,8 @@ export function LibraryLayout({ children }: LibraryLayoutProps) {
436
436
  ) : (
437
437
  <>
438
438
  <div className="px-3 py-3">
439
- <Button className="w-full gap-1.5" size="sm" asChild>
440
- <NavLink to="/record">
441
- <IconPlayerRecord className="h-4 w-4" />
442
- {t("navigation.newRecording")}
443
- </NavLink>
439
+ <Button className="w-full" size="sm" asChild>
440
+ <NavLink to="/record">{t("navigation.newRecording")}</NavLink>
444
441
  </Button>
445
442
  <ImportMenu
446
443
  uploadHref="/record?autoUpload=1"
@@ -652,7 +649,6 @@ export function LibraryLayout({ children }: LibraryLayoutProps) {
652
649
  feedback={feedbackButton}
653
650
  search={searchButton}
654
651
  collapse={collapseButton}
655
- className={showCollapsedSidebar ? undefined : "px-0 py-0"}
656
652
  />
657
653
  </aside>
658
654
 
@@ -8,7 +8,6 @@ import {
8
8
  IconDeviceDesktop,
9
9
  IconDeviceScreen,
10
10
  IconMicrophone,
11
- IconPlayerRecord,
12
11
  IconVideo,
13
12
  } from "@tabler/icons-react";
14
13
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -912,9 +911,8 @@ export function PreRecordPanel({
912
911
  needsCamera && cameraId !== "default" ? cameraId : null,
913
912
  })
914
913
  }
915
- className={cn("h-12 gap-2", onCancel ? "flex-1" : "w-full")}
914
+ className={cn("h-12", onCancel ? "flex-1" : "w-full")}
916
915
  >
917
- <IconPlayerRecord className="h-4 w-4" />
918
916
  {t("preRecord.startRecording")}
919
917
  </Button>
920
918
  </div>
@@ -8,12 +8,7 @@ import {
8
8
  type BugReportContext,
9
9
  type BugReportSeverity,
10
10
  } from "@shared/bug-report";
11
- import {
12
- IconArrowRight,
13
- IconBug,
14
- IconExternalLink,
15
- IconShieldCheck,
16
- } from "@tabler/icons-react";
11
+ import { IconBug, IconShieldCheck } from "@tabler/icons-react";
17
12
  import { useEffect, useMemo, useRef, useState } from "react";
18
13
  import { useLocation, useOutlet } from "react-router";
19
14
 
@@ -245,9 +240,7 @@ export default function BugReportRoute() {
245
240
  </div>
246
241
 
247
242
  <Button className="h-11 w-full" onClick={startRecording}>
248
- <IconExternalLink size={18} />
249
243
  {t("bugReportRoute.startRecording")}
250
- <IconArrowRight size={18} className="ms-auto" />
251
244
  </Button>
252
245
  </div>
253
246
 
@@ -10,7 +10,6 @@ import {
10
10
  IconLink,
11
11
  IconSparkles,
12
12
  IconUpload,
13
- IconVideo,
14
13
  } from "@tabler/icons-react";
15
14
  import { useQueryClient } from "@tanstack/react-query";
16
15
  import {
@@ -374,9 +373,8 @@ export default function ImportRoute() {
374
373
  </Link>
375
374
  <Link
376
375
  to={recordHref}
377
- className="inline-flex items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground"
376
+ className="text-xs font-medium text-muted-foreground hover:text-foreground"
378
377
  >
379
- <IconVideo className="h-3.5 w-3.5" />
380
378
  {t("preRecord.recordNew")}
381
379
  </Link>
382
380
  </div>
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-08-04
4
+ ---
5
+
6
+ Recording buttons are now text-only for a cleaner Clips interface.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-04
4
+ ---
5
+
6
+ Save settings now matches the other Clips settings buttons.
@@ -923,6 +923,7 @@ h1 {
923
923
  background: var(--primary);
924
924
  color: var(--primary-foreground);
925
925
  cursor: pointer;
926
+ font-size: 13px;
926
927
  font-weight: 700;
927
928
  }
928
929
 
@@ -32,6 +32,39 @@ Move behavior into shared toolkit primitives when it is:
32
32
  Keep behavior app-local when the abstraction would hide important domain
33
33
  language or make a simple app-specific workflow harder to understand.
34
34
 
35
+ ## Agent Surface Contract
36
+
37
+ The repeated app shell has two distinct navigation surfaces:
38
+
39
+ - The left rail owns domain destinations, settings, and chat history when the
40
+ app has a full-page chat route. Do not label a domain workflow as `Chat` just
41
+ because the app was scaffolded from the chat template.
42
+ - The right `AgentSidebar` owns contextual agent work. Domain buttons that call
43
+ `sendToAgentChat` should open it (`openSidebar: true`) so the user can see,
44
+ steer, and review the agent without losing the page they were using.
45
+ - Keep `/` or `/chat/*` as the full-page chat surface when the starter provides
46
+ one. Put domain workflows on named routes and wire the shell's route checks,
47
+ navigation labels, and handoffs to those routes together.
48
+ - Use familiar message or neutral action icons for agent affordances. Never use
49
+ sparkle, wand, magic, or robot icons as an AI label; the copy should carry the
50
+ meaning.
51
+ - Give the right rail a quiet visual boundary with a subtle surface shift,
52
+ divider, or both. The domain page and AgentSidebar should not collapse into a
53
+ single undifferentiated background.
54
+ - Any button labeled as agent work must use `sendToAgentChat` with bounded
55
+ context and `openSidebar: true`; local deterministic analysis should be
56
+ labeled as local, preview, or analyze. For original/generated review, stack
57
+ the source above the result by default and use side-by-side only for short,
58
+ highly scannable content.
59
+ - Standalone apps with `AgentSidebar` must resolve one assistant-ui runtime
60
+ context. Match direct assistant-ui pins to the installed core/toolkit peer
61
+ graph, use Vite dedupe/aliases when linked dependencies can split contexts,
62
+ and verify an AI handoff produces no stale-index console error.
63
+
64
+ Contextual agent UI is not a reason to expose every option at once. Start with
65
+ the domain task's primary action, reveal review or configuration only when the
66
+ current state needs it, and let the sidebar carry conversational depth.
67
+
35
68
  ## Discover Before Building
36
69
 
37
70
  Before creating an app-local version of repeated workspace or agent UI: