@agent-native/core 0.141.5 → 0.141.7

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 (235) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +3 -14
  3. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +20 -8
  4. package/corpus/templates/analytics/.agents/skills/prometheus/SKILL.md +5 -5
  5. package/corpus/templates/analytics/AGENTS.md +2 -2
  6. package/corpus/templates/analytics/actions/compose-dashboard.ts +1 -1
  7. package/corpus/templates/analytics/actions/get-first-party-analytics-health.ts +15 -1
  8. package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +135 -0
  9. package/corpus/templates/analytics/actions/navigate.ts +1 -1
  10. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +2 -2
  11. package/corpus/templates/analytics/actions/update-dashboard.ts +0 -1
  12. package/corpus/templates/analytics/actions/view-screen.ts +0 -20
  13. package/corpus/templates/analytics/app/components/layout/Header.tsx +0 -1
  14. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +5 -5
  15. package/corpus/templates/analytics/app/i18n-data.ts +330 -90
  16. package/corpus/templates/analytics/app/pages/Agents.tsx +0 -3
  17. package/corpus/templates/analytics/app/pages/DataSources.tsx +66 -30
  18. package/corpus/templates/analytics/app/pages/Settings.tsx +22 -43
  19. package/corpus/templates/analytics/app/pages/settings/settings-search.ts +23 -20
  20. package/corpus/templates/analytics/app/routes/extensions._index.tsx +1 -1
  21. package/corpus/templates/analytics/app/routes/settings.$.tsx +1 -0
  22. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  23. package/corpus/templates/analytics/changelog/2026-08-05-historical-analytics-rollups-now-repair-automatically-after-.md +6 -0
  24. package/corpus/templates/analytics/changelog/2026-08-05-settings-no-longer-includes-an-unnecessary-about-section.md +6 -0
  25. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +1 -1
  26. package/corpus/templates/analytics/netlify.toml +4 -0
  27. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +109 -0
  28. package/corpus/templates/analytics/scripts/first-party-analytics-bigquery.sql +104 -0
  29. package/corpus/templates/analytics/server/jobs/analytics-rollup-backfill.ts +342 -0
  30. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -2
  31. package/corpus/templates/analytics/server/lib/analytics-rollup-lock.ts +8 -0
  32. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +11 -29
  33. package/corpus/templates/analytics/server/lib/dashboards-store.ts +55 -0
  34. package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +1058 -0
  35. package/corpus/templates/analytics/server/lib/first-party-analytics-health.ts +151 -46
  36. package/corpus/templates/analytics/server/lib/first-party-analytics-rollups.ts +15 -9
  37. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +59 -17
  38. package/corpus/templates/analytics/server/lib/real-data-actions.ts +1 -3
  39. package/corpus/templates/analytics/server/plugins/agent-chat.ts +2 -4
  40. package/corpus/templates/analytics/server/plugins/analytics-rollup-backfill-jobs.ts +61 -0
  41. package/corpus/templates/analytics/server/plugins/db.ts +58 -187
  42. package/corpus/templates/analytics/server/routes/api/analytics-rollups/backfill.post.ts +53 -0
  43. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +8 -6
  44. package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +16 -1
  45. package/corpus/templates/assets/AGENTS.md +1 -0
  46. package/corpus/templates/assets/actions/_helpers.ts +12 -0
  47. package/corpus/templates/assets/actions/generate-image.ts +9 -3
  48. package/corpus/templates/assets/actions/import-style-from-url.ts +115 -0
  49. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +3 -1
  50. package/corpus/templates/assets/app/routes/extensions._index.tsx +1 -1
  51. package/corpus/templates/assets/app/routes/settings.$.tsx +1 -0
  52. package/corpus/templates/assets/app/routes/settings.tsx +5 -0
  53. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  54. package/corpus/templates/assets/changelog/2026-08-05-brand-kits-can-import-a-website-s-hydrated-visual-language-a.md +6 -0
  55. package/corpus/templates/assets/changelog/2026-08-05-generated-images-now-hand-off-embeddable-previews-to-other-w.md +6 -0
  56. package/corpus/templates/assets/server/lib/generation.ts +58 -0
  57. package/corpus/templates/assets/shared/api.ts +12 -0
  58. package/corpus/templates/brain/app/routes/extensions._index.tsx +1 -1
  59. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  60. package/corpus/templates/brain/app/routes.ts +1 -1
  61. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +3 -1
  62. package/corpus/templates/calendar/app/routes/_app.extensions._index.tsx +1 -1
  63. package/corpus/templates/calendar/app/routes/_app.settings.$.tsx +1 -0
  64. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  65. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  66. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  67. package/corpus/templates/chat/app/root.tsx +1 -1
  68. package/corpus/templates/chat/app/routes/agent.tsx +7 -7
  69. package/corpus/templates/chat/app/routes/extensions._index.tsx +1 -1
  70. package/corpus/templates/chat/app/routes/settings.$.tsx +1 -0
  71. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  72. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  73. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +1 -1
  74. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +1 -1
  75. package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +1 -1
  76. package/corpus/templates/clips/app/routes/_app.settings.$.tsx +1 -0
  77. package/corpus/templates/clips/changelog/2026-08-05-clips-overlays-now-use-clean-surfaces-without-clipped-shadow.md +6 -0
  78. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +2 -2
  79. package/corpus/templates/clips/desktop/src/styles.css +3 -54
  80. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +3 -3
  81. package/corpus/templates/content/app/routes/_app.extensions._index.tsx +1 -1
  82. package/corpus/templates/content/app/routes/_app.settings.$.tsx +1 -0
  83. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  84. package/corpus/templates/content/e2e/global-setup.ts +1 -1
  85. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +6 -1
  86. package/corpus/templates/design/actions/analyze-brand-assets.ts +7 -7
  87. package/corpus/templates/design/actions/get-design-system.ts +3 -1
  88. package/corpus/templates/design/actions/import-from-url.ts +6 -5
  89. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +2 -2
  90. package/corpus/templates/design/app/routes/extensions._index.tsx +1 -1
  91. package/corpus/templates/design/app/routes/settings.$.tsx +1 -0
  92. package/corpus/templates/design/app/routes/team.tsx +1 -1
  93. package/corpus/templates/design/changelog/2026-08-05-missing-design-systems-now-return-a-clear-not-found-response.md +6 -0
  94. package/corpus/templates/design/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-de.md +6 -0
  95. package/corpus/templates/design/e2e/global-setup.ts +1 -1
  96. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  97. package/corpus/templates/dispatch/app/routes/settings.$.tsx +1 -0
  98. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  99. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +1 -1
  100. package/corpus/templates/factory/app/routes/extensions._index.tsx +1 -1
  101. package/corpus/templates/factory/app/routes/settings.$.tsx +1 -0
  102. package/corpus/templates/factory/app/routes/team.tsx +1 -1
  103. package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +1 -1
  104. package/corpus/templates/forms/app/routes/_app.settings.$.tsx +1 -0
  105. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  106. package/corpus/templates/forms/shared/navigation.ts +1 -1
  107. package/corpus/templates/macros/app/routes/extensions._index.tsx +1 -1
  108. package/corpus/templates/macros/app/routes/settings.$.tsx +1 -0
  109. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  110. package/corpus/templates/mail/app/routes/extensions._index.tsx +1 -1
  111. package/corpus/templates/mail/app/routes/settings.$.tsx +1 -0
  112. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  113. package/corpus/templates/plan/app/routes/extensions._index.tsx +1 -1
  114. package/corpus/templates/plan/app/routes/settings.$.tsx +1 -0
  115. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  116. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +3 -1
  117. package/corpus/templates/slides/actions/analyze-brand-assets.ts +7 -7
  118. package/corpus/templates/slides/actions/import-from-url.ts +6 -6
  119. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +2 -2
  120. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
  121. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +3 -0
  122. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1 -1
  123. package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +9 -3
  124. package/corpus/templates/slides/app/context/DeckContext.tsx +71 -20
  125. package/corpus/templates/slides/app/global.css +6 -0
  126. package/corpus/templates/slides/app/i18n/en-US.ts +5 -5
  127. package/corpus/templates/slides/app/lib/create-deck-generation.ts +9 -5
  128. package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -0
  129. package/corpus/templates/slides/app/pages/Index.tsx +16 -5
  130. package/corpus/templates/slides/app/routes/extensions._index.tsx +1 -1
  131. package/corpus/templates/slides/app/routes/settings.$.tsx +1 -0
  132. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  133. package/corpus/templates/slides/changelog/2026-08-05-failed-deck-creation-and-reference-uploads-now-recover-clean.md +6 -0
  134. package/corpus/templates/slides/changelog/2026-08-05-new-presentation-prompts-now-clearly-describe-presentation-g.md +6 -0
  135. package/corpus/templates/slides/changelog/2026-08-05-slides-recover-completed-generation-results-after-a-sync-hic.md +6 -0
  136. package/corpus/templates/slides/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-st.md +6 -0
  137. package/corpus/templates/tasks/app/components/layout/Header.tsx +3 -1
  138. package/corpus/templates/tasks/app/routes/extensions._index.tsx +1 -1
  139. package/corpus/templates/tasks/app/routes/settings.$.tsx +1 -0
  140. package/dist/agent/engine/ai-sdk-engine.js +49 -3
  141. package/dist/agent/production-agent.d.ts +1 -0
  142. package/dist/agent/production-agent.js +8 -0
  143. package/dist/agent/types.d.ts +7 -0
  144. package/dist/client/AssistantChat.js +1 -1
  145. package/dist/client/agent-chat-adapter.d.ts +1 -1
  146. package/dist/client/agent-chat-adapter.js +30 -3
  147. package/dist/client/agent-page/AgentWorkspaceContent.d.ts +1 -1
  148. package/dist/client/agent-page/AgentWorkspaceContent.js +13 -13
  149. package/dist/client/chat/run-recovery.d.ts +2 -1
  150. package/dist/client/chat/run-recovery.js +14 -3
  151. package/dist/client/embed-auth.js +6 -2
  152. package/dist/client/error-format.d.ts +1 -0
  153. package/dist/client/error-format.js +16 -2
  154. package/dist/client/integrations/IntegrationsPanel.js +40 -6
  155. package/dist/client/org/OrgSwitcher.js +2 -2
  156. package/dist/client/org/TeamPage.js +92 -72
  157. package/dist/client/require-session.d.ts +1 -1
  158. package/dist/client/require-session.js +3 -3
  159. package/dist/client/resources/use-mcp-servers.d.ts +5 -0
  160. package/dist/client/resources/use-mcp-servers.js +36 -0
  161. package/dist/client/settings/AccountSettingsCard.js +40 -35
  162. package/dist/client/settings/AutomationsSection.js +1 -1
  163. package/dist/client/settings/DemoModeSection.d.ts +3 -1
  164. package/dist/client/settings/DemoModeSection.js +4 -1
  165. package/dist/client/settings/ExtensionsSettingsContent.js +1 -1
  166. package/dist/client/settings/SchedulingTimezoneField.d.ts +3 -1
  167. package/dist/client/settings/SchedulingTimezoneField.js +9 -5
  168. package/dist/client/settings/SettingsPanel.d.ts +4 -1
  169. package/dist/client/settings/SettingsPanel.js +21 -21
  170. package/dist/client/settings/SettingsTabsPage.d.ts +2 -2
  171. package/dist/client/settings/SettingsTabsPage.js +98 -45
  172. package/dist/client/settings/VoiceTranscriptionSection.js +6 -1
  173. package/dist/client/settings/useSettingsPanelController.js +47 -8
  174. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  175. package/dist/ingestion/website.d.ts +30 -0
  176. package/dist/localization/default-messages.d.ts +5 -0
  177. package/dist/localization/default-messages.js +5 -0
  178. package/dist/mcp-client/oauth-routes.js +1 -1
  179. package/dist/mcp-client/routes.d.ts +1 -0
  180. package/dist/mcp-client/routes.js +49 -0
  181. package/dist/navigation/index.js +16 -5
  182. package/dist/observability/routes.d.ts +3 -3
  183. package/dist/provider-api/actions/custom-provider-registration.d.ts +13 -13
  184. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  185. package/dist/scripts/call-agent.js +11 -0
  186. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  187. package/dist/server/auth.js +9 -7
  188. package/dist/server/identity-sso.js +2 -1
  189. package/dist/server/onboarding-html.js +57 -34
  190. package/dist/server/realtime-token.d.ts +1 -1
  191. package/dist/server/transcribe-voice.d.ts +1 -1
  192. package/dist/server/workspace-provider-oauth.js +1 -1
  193. package/dist/setup-connections/onboarding.js +1 -1
  194. package/dist/shared/index.d.ts +1 -1
  195. package/dist/shared/index.js +1 -1
  196. package/dist/shared/sign-in-journey.d.ts +5 -2
  197. package/dist/shared/sign-in-journey.js +10 -4
  198. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
  199. package/dist/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  200. package/dist/templates/chat/app/root.tsx +1 -1
  201. package/dist/templates/chat/app/routes/agent.tsx +7 -7
  202. package/dist/templates/chat/app/routes/extensions._index.tsx +1 -1
  203. package/dist/templates/chat/app/routes/settings.$.tsx +1 -0
  204. package/dist/templates/chat/app/routes/team.tsx +1 -1
  205. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
  206. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
  207. package/docs/content/authentication.mdx +4 -5
  208. package/docs/content/template-analytics-developers.mdx +1 -1
  209. package/docs/content/template-calendar-developers.mdx +1 -1
  210. package/docs/content/template-chat-developers.mdx +2 -2
  211. package/docs/content/template-content-developers.mdx +1 -1
  212. package/docs/content/template-mail-developers.mdx +1 -1
  213. package/docs/content/template-plan-developers.mdx +1 -1
  214. package/docs/content/toolkit-command-navigation.mdx +6 -6
  215. package/docs/content/toolkit-org-team.mdx +1 -1
  216. package/docs/content/toolkit-settings.mdx +8 -8
  217. package/docs/content/toolkit-setup-connections.mdx +1 -1
  218. package/package.json +1 -1
  219. package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
  220. package/src/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  221. package/src/templates/chat/app/root.tsx +1 -1
  222. package/src/templates/chat/app/routes/agent.tsx +7 -7
  223. package/src/templates/chat/app/routes/extensions._index.tsx +1 -1
  224. package/src/templates/chat/app/routes/settings.$.tsx +1 -0
  225. package/src/templates/chat/app/routes/team.tsx +1 -1
  226. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
  227. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
  228. package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +0 -62
  229. package/corpus/templates/analytics/actions/install-dashboard-template.ts +0 -369
  230. package/corpus/templates/analytics/actions/list-dashboard-templates.ts +0 -47
  231. package/corpus/templates/analytics/actions/list-native-v2-dashboard-templates.ts +0 -34
  232. package/corpus/templates/analytics/app/routes/catalog.tsx +0 -240
  233. package/corpus/templates/analytics/changelog/2026-08-05-historical-analytics-rollups-stay-complete-and-atomic.md +0 -6
  234. package/corpus/templates/analytics/changelog/2026-08-05-historical-rollups-stay-complete-while-live-events-arrive.md +0 -6
  235. package/src/templates/default/actions/navigate.spec.ts +0 -53
@@ -0,0 +1 @@
1
+ export { default, meta } from "./settings.js";
@@ -7,5 +7,5 @@ export function meta() {
7
7
  }
8
8
 
9
9
  export default function TeamRoute() {
10
- return <Navigate to="/settings#organization" replace />;
10
+ return <Navigate to="/settings/organization" replace />;
11
11
  }
@@ -38,7 +38,35 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
38
38
 
39
39
  Use web browsing only for public URLs. Auth-gated docs usually need their matching connector. For threads, read the parent and all replies; note when there are no replies, and inspect linked files or newer follow-ups when the source refers to them.
40
40
 
41
- 2. Decompose and categorize every actionable item.
41
+ 2. Check whether this defect has already been reported.
42
+
43
+ A feedback channel holds months of reports and nobody remembers all of them,
44
+ so the same defect gets filed by different people weeks apart and every
45
+ filing reads as new. One recorded case: the same Clips recording bug was
46
+ filed almost word-for-word 29 days apart by the same reporter, and neither
47
+ message mentions the other. Another defect was reported fifteen times by
48
+ nine people across three months, was announced as fixed once in the middle,
49
+ and was reported again two weeks later.
50
+
51
+ Search before fixing, going back at least three months: the source channel
52
+ in the reporter's words and in your own, Sentry, and merged PR titles. Search
53
+ the feature name, the error text, and the surface separately — repeat reports
54
+ rarely share vocabulary.
55
+
56
+ - **No prior report** — proceed normally.
57
+ - **Prior report, no fix landed** — say how long it has been open. The person
58
+ forwarding it to you is likely seeing it for the second time too.
59
+ - **Prior report, fix landed** — this is a regression, and the bar is now
60
+ different. Patching it again and reporting done is exactly how it returns a
61
+ third time. Find why the first fix stopped holding, and leave behind
62
+ something that fails when it breaks again: a test that reproduces the
63
+ user's path, or an assertion in the flow the report names.
64
+
65
+ Report the repeat explicitly, with dates and reporters. A defect on its third
66
+ report is not a bug ticket, it is a missing check — and the missing check is
67
+ the deliverable, not the patch.
68
+
69
+ 3. Decompose and categorize every actionable item.
42
70
 
43
71
  Build a compact checklist before changing code. For each item, record the
44
72
  symptom, expected behavior, evidence, and owning surface: UI, action/tool,
@@ -49,7 +77,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
49
77
  - **Question or unclear**: Missing detail, contradictory feedback, or behavior you cannot inspect. Ask or flag it.
50
78
  - **Out of scope**: Outside this repo, already shipped, intentionally unsupported, or too low-signal. Note briefly and skip.
51
79
 
52
- 3. For data, permissions, or resource-lifecycle feedback, verify the whole capability boundary before calling it UX.
80
+ 4. For data, permissions, or resource-lifecycle feedback, verify the whole capability boundary before calling it UX.
53
81
 
54
82
  - Check the supported create/read/update/delete lifecycle, including whether the backend/action exists when a UI control is missing.
55
83
  - Inspect both the UI and the shared action/tool surface so agent and UI behavior stay in parity.
@@ -57,7 +85,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
57
85
  - Treat possible cross-user or cross-organization exposure as a security/correctness bug and verify it before proposing polish.
58
86
  - Keep undefined product policy separate from implementation bugs. If supported source types or scope semantics are not defined, flag the contract question instead of inventing behavior.
59
87
 
60
- 4. Check Sentry when the feedback smells like an error.
88
+ 5. Check Sentry when the feedback smells like an error.
61
89
 
62
90
  - Use the Sentry skill/plugin if available, or the repo's Sentry scripts if documented.
63
91
  - Search by route, stack symbol, error text, and symptom keywords.
@@ -65,7 +93,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
65
93
  - Cite issue IDs or links when you find a match.
66
94
  - If nothing matches, say that plainly.
67
95
 
68
- 5. Fix only the clear bugs you agree with.
96
+ 6. Fix only the clear bugs you agree with.
69
97
 
70
98
  - Verify before fixing: reproduce locally, read the relevant code, inspect logs, or confirm with a stack trace.
71
99
  - Keep each fix narrow and mapped to a feedback item.
@@ -73,7 +101,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
73
101
  - Do not switch branches, stash, reset, force-push, or open a PR unless the user asks.
74
102
  - Add or update focused tests when the bug risk warrants it.
75
103
 
76
- 6. Treat UX feedback with restraint.
104
+ 7. Treat UX feedback with restraint.
77
105
 
78
106
  Do not solve UX problems by adding more visible controls, helper text, banners, top-level nav, or always-open panels by default. Prefer cleaner interaction models:
79
107
 
@@ -85,7 +113,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
85
113
 
86
114
  When proposing a UX change, write it as: what to change, why it helps, and the tradeoff. Keep each proposal short.
87
115
 
88
- 7. Verify changed behavior.
116
+ 8. Verify changed behavior.
89
117
 
90
118
  - Run the smallest relevant test or typecheck command.
91
119
  - For UI fixes, inspect the actual screen with a browser tool you already
@@ -100,6 +128,9 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
100
128
  Keep the final report short:
101
129
 
102
130
  ```md
131
+ ## Repeat Reports
132
+ - [defect] - reported [N] times since [date] by [reporters]; [what now fails if it regresses]
133
+
103
134
  ## Bugs Fixed
104
135
  - [feedback item] - [what changed, file:line]
105
136
 
@@ -204,7 +204,7 @@ For public pages (share links, embeds, marketing pages) that need anonymous view
204
204
  ```ts
205
205
  const ret = window.location.pathname + window.location.search;
206
206
  window.location.href =
207
- "/_agent-native/sign-in?return=" + encodeURIComponent(ret);
207
+ "/sign-in?return=" + encodeURIComponent(ret);
208
208
  ```
209
209
 
210
210
  After successful sign-in (token / email-password / Google OAuth), the framework redirects to `return`. The path is validated as same-origin via the URL parser — open-redirect / header-injection inputs fall back to `/`.
@@ -230,7 +230,9 @@ will be rejected.
230
230
 
231
231
  `AppProviders` applies `RequireSession` automatically on its private branch. It
232
232
  resolves the session on the client and redirects signed-out visitors to
233
- `/_agent-native/sign-in?return=…` before mounting the routed shell:
233
+ `/sign-in?return=…` before mounting the routed shell. The legacy
234
+ `/_agent-native/sign-in` path remains supported for older generated apps and
235
+ bookmarks:
234
236
 
235
237
  ```tsx
236
238
  import { AppProviders } from "@agent-native/core/client/hooks";
@@ -384,7 +384,7 @@ function MyComponent() {
384
384
  Templates with **public pages** (share links, embeds, marketing pages) often need an in-page CTA that asks anonymous viewers to sign in and brings them back to the page they were on. The framework provides a single entry point for this:
385
385
 
386
386
  ```
387
- /_agent-native/sign-in?return=<same-origin-path>
387
+ /sign-in?return=<same-origin-path>
388
388
  ```
389
389
 
390
390
  When an anonymous viewer hits this URL, the framework's login page is served. After a successful sign-in (magic link, email/password, token, or Google OAuth), the browser returns to `return`.
@@ -399,8 +399,7 @@ import { Button } from "@/components/ui/button";
399
399
  function SignInCta() {
400
400
  const onClick = () => {
401
401
  const ret = window.location.pathname + window.location.search;
402
- window.location.href =
403
- "/_agent-native/sign-in?return=" + encodeURIComponent(ret);
402
+ window.location.href = "/sign-in?return=" + encodeURIComponent(ret);
404
403
  };
405
404
  return <Button onClick={onClick}>Sign in</Button>;
406
405
  }
@@ -408,13 +407,13 @@ function SignInCta() {
408
407
 
409
408
  ### Bookmarked private paths
410
409
 
411
- Normal app pages use one impersonal, public-cacheable SSR shell for every visitor. `AppProviders` checks the session on the client; on a private path such as `/dashboard`, it redirects an anonymous visitor to `/_agent-native/sign-in?return=%2Fdashboard` before mounting private app UI. After sign-in, the visitor returns to `/dashboard`. Pass `isPublicPath` for public/SEO routes, or `sessionBypass` for a surface that authenticates through another scoped mechanism such as an MCP embed token.
410
+ Normal app pages use one impersonal, public-cacheable SSR shell for every visitor. `AppProviders` checks the session on the client; on a private path such as `/dashboard`, it redirects an anonymous visitor to `/sign-in?return=%2Fdashboard` before mounting private app UI. After sign-in, the visitor returns to `/dashboard`. Pass `isPublicPath` for public/SEO routes, or `sessionBypass` for a surface that authenticates through another scoped mechanism such as an MCP embed token.
412
411
 
413
412
  How long that shell is cached is a deployment-wide setting — see [SSR Caching](/docs/deployment#ssr-caching) for `AGENT_NATIVE_SSR_CACHE`. Shortening or disabling the cache changes duration only; SSR still renders the anonymous branch with cookies stripped.
414
413
 
415
414
  ### Behind the scenes: Google OAuth
416
415
 
417
- Both flows (the explicit `/_agent-native/sign-in` entrypoint and the bookmarked-path case) thread the return URL through the OAuth state. The state is HMAC-signed, so it can't be forged in transit. On the callback, the return URL is re-validated as same-origin before the redirect — so a leaked signing key still can't be turned into an open-redirect oracle.
416
+ Both flows (the explicit `/sign-in` entrypoint and the bookmarked-path case) thread the return URL through the OAuth state. The legacy `/_agent-native/sign-in` alias remains accepted for older links. The state is HMAC-signed, so it can't be forged in transit. On the callback, the return URL is re-validated as same-origin before the redirect — so a leaked signing key still can't be turned into an open-redirect oracle.
418
417
 
419
418
  If your template wraps `/_agent-native/google/auth-url` directly (e.g. mail and calendar templates do, to widen scopes), accept a `?return=<path>` query and forward it via the options-object form of `encodeOAuthState`:
420
419
 
@@ -158,7 +158,7 @@ Plus the org tables (`organizations`, `org_members`, `org_invitations`) from `@a
158
158
 
159
159
  Every operation is a TypeScript file in `templates/analytics/actions/`, auto-mounted at `POST /_agent-native/actions/:name`.
160
160
 
161
- **Dashboards & panels** — `update-dashboard` (new/full-config saves), `mutate-dashboard` (existing-dashboard edits via a small typed script API), `compose-dashboard` (build a large first-party dashboard from a metric-key catalog in one atomic call), `get-sql-dashboard`, `list-sql-dashboards`, `archive-dashboard`, `delete-sql-dashboard` / `delete-explorer-dashboard`, `reorder-dashboard-panels`, `install-dashboard-template` / `list-dashboard-templates`.
161
+ **Dashboards & panels** — `update-dashboard` (new/full-config saves), `mutate-dashboard` (existing-dashboard edits via a small typed script API), `compose-dashboard` (build a large first-party dashboard from a metric-key catalog in one atomic call), `get-sql-dashboard`, `list-sql-dashboards`, `archive-dashboard`, `delete-sql-dashboard` / `delete-explorer-dashboard`, and `reorder-dashboard-panels`.
162
162
 
163
163
  **Analyses** — `save-analysis`, `get-analysis`, `list-analyses`, `rename-analysis`, `hide-analysis`, `list-analysis-revisions` / `restore-analysis-revision`.
164
164
 
@@ -340,7 +340,7 @@ Availability rules live in per-user settings under the `calendar-availability` k
340
340
  ]}
341
341
  />
342
342
 
343
- Two legacy routes stay mounted for links shared before a URL scheme changed: `book.$slug.tsx` (no username segment) and `meet.$username.$slug.tsx`, both of which canonicalize to `/book/:username/:slug`. `_app.team.tsx` redirects to `/settings#organization` — team management lives in Settings, not a separate page.
343
+ Two legacy routes stay mounted for links shared before a URL scheme changed: `book.$slug.tsx` (no username segment) and `meet.$username.$slug.tsx`, both of which canonicalize to `/book/:username/:slug`. `_app.team.tsx` redirects to `/settings/organization` — team management lives in Settings, not a separate page.
344
344
 
345
345
  ## Customizing it
346
346
 
@@ -51,7 +51,7 @@ Three routes are mounted whether or not your app ever links to them:
51
51
  ],
52
52
  [
53
53
  "/extensions",
54
- "redirects to /settings#extensions",
54
+ "redirects to /settings/extensions",
55
55
  "Extensions are managed from Settings, not a standalone list page",
56
56
  ],
57
57
  [
@@ -66,7 +66,7 @@ Three routes are mounted whether or not your app ever links to them:
66
66
  ],
67
67
  [
68
68
  "/team",
69
- "redirects to /settings#organization",
69
+ "redirects to /settings/organization",
70
70
  "Organization membership lives under Settings",
71
71
  ],
72
72
  ]}
@@ -304,7 +304,7 @@ Every operation is a TypeScript file in `templates/content/actions/`, auto-mount
304
304
  | `_app.favorites.tsx` | Redirects into the current space's Favorites Files-database document |
305
305
  | `_app.local-files.tsx` | `/local-files` — connect, pull, check, and push local folders |
306
306
  | `_app.settings.tsx` | Settings |
307
- | `_app.team.tsx` | `/team` redirects to `/settings#organization` |
307
+ | `_app.team.tsx` | `/team` redirects to `/settings/organization` |
308
308
  | `_app.agent.tsx` | `/agent` — the full agent chat tab page |
309
309
  | `_app.extensions.tsx` + `_app.extensions._index.tsx` + `_app.extensions.$id.tsx` + `_app.extensions.$id.$slug.tsx` | `/extensions` — sandboxed widget routes (the framework's Alpine.js extension system; unrelated to the Tiptap "editor extensions" used elsewhere in this doc) |
310
310
  | `p.$id.tsx` | `/p/:id` — public, read-only document view with a read-only agent chat |
@@ -323,7 +323,7 @@ Emails flowing through the API have the shape `{ id, threadId, from, to, cc, sub
323
323
  - `/draft-queue` and `/draft-queue/:id` — the draft queue list and detail view
324
324
  - `/settings` — account connections, tracking, automations, aliases, Slack intake
325
325
  - `/team` — redirects to `/settings?section=team`
326
- - `/extensions` — installed extension widgets (redirects to `/settings#extensions` when no extension id is given)
326
+ - `/extensions` — installed extension widgets (redirects to `/settings/extensions` when no extension id is given)
327
327
 
328
328
  ## Customizing it
329
329
 
@@ -676,7 +676,7 @@ pnpm --filter plan test -- plan-mdx plan-block-registry
676
676
  />
677
677
 
678
678
  `app/routes/extensions.tsx` and `app/routes/team.tsx` are thin redirects to
679
- `/settings#extensions` and `/settings#organization` — Plan installs the same
679
+ `/settings/extensions` and `/settings/organization` — Plan installs the same
680
680
  framework-wide [Extensions](/docs/extensions) mini-app system and organization
681
681
  management every other template gets, rather than a Plan-specific system.
682
682
  Extensions are sandboxed Alpine.js mini-apps a user installs at runtime from
@@ -88,12 +88,12 @@ export const resolveOpenPath = createStandardOpenPathResolver({
88
88
 
89
89
  Use a small predictable route set:
90
90
 
91
- | Route | Purpose |
92
- | --------------------------- | -------------------------------------------------------------------------- |
93
- | `/` | Primary app surface. |
94
- | `/settings` | Standard settings tabs. |
95
- | `/team` or `/settings#team` | Team management. |
96
- | Resource routes | `/documents/:id`, `/dashboards/:id`, or equivalent focused resource pages. |
91
+ | Route | Purpose |
92
+ | ----------------------------------- | -------------------------------------------------------------------------- |
93
+ | `/` | Primary app surface. |
94
+ | `/settings` | Standard settings tabs. |
95
+ | `/team` or `/settings/organization` | Team management. |
96
+ | Resource routes | `/documents/:id`, `/dashboards/:id`, or equivalent focused resource pages. |
97
97
 
98
98
  ## UX Standard {#ux-standard}
99
99
 
@@ -40,7 +40,7 @@ connections, service tokens, and app switching.
40
40
  ## API {#api}
41
41
 
42
42
  Render organization context wherever data scope changes. Put `OrgSwitcher` in
43
- the persistent shell and make `/settings#team` or `/team` open `TeamPage`.
43
+ the persistent shell and make `/settings/organization` or `/team` open `TeamPage`.
44
44
 
45
45
  ```tsx
46
46
  import {
@@ -27,14 +27,14 @@ free the moment an app adopts the shared page.
27
27
 
28
28
  ## Pieces {#pieces}
29
29
 
30
- | Piece | Purpose |
31
- | ------------------------ | ------------------------------------------------------------------------------------- |
32
- | `<SettingsTabsPage>` | Standard tabbed settings route surface with a built-in settings search box. |
33
- | `useAgentSettingsTabs()` | Framework-provided agent, model, key, automation, and voice tabs that apps can mount. |
34
- | `SettingsSearchEntry` | A deep-link target (label, keywords, tab, and hash) that makes a control findable. |
35
- | `<LanguagePicker>` | Standard language selector for app settings. |
36
- | `openAgentSettings()` | Compatibility escape hatch for opening the sidebar settings tab when needed. |
37
- | Hash deep links | Stable links such as `/settings#secrets:OPENAI_API_KEY` and `/settings#connections`. |
30
+ | Piece | Purpose |
31
+ | ------------------------ | -------------------------------------------------------------------------------------------------- |
32
+ | `<SettingsTabsPage>` | Standard tabbed settings route surface with a built-in settings search box. |
33
+ | `useAgentSettingsTabs()` | Framework-provided agent, model, key, automation, and voice tabs that apps can mount. |
34
+ | `SettingsSearchEntry` | A deep-link target (label, keywords, tab, and hash) that makes a control findable. |
35
+ | `<LanguagePicker>` | Standard language selector for app settings. |
36
+ | `openAgentSettings()` | Compatibility escape hatch for opening the sidebar settings tab when needed. |
37
+ | Deep links | Stable links such as `/settings/integrations/secrets/OPENAI_API_KEY` and `/settings/integrations`. |
38
38
 
39
39
  ## Page Contract {#page-contract}
40
40
 
@@ -73,7 +73,7 @@ registerOnboardingStep({
73
73
  kind: "link",
74
74
  label: "Open settings",
75
75
  primary: true,
76
- payload: { url: "/settings#secrets" },
76
+ payload: { url: "/settings/integrations#secrets" },
77
77
  },
78
78
  ],
79
79
  isComplete: async () => hasOpenAIKey(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.141.5",
3
+ "version": "0.141.7",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -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="/settings#agent"
175
+ agentPageHref="/settings/agent"
176
176
  suggestions={[
177
177
  t("chat.inspectSuggestionCapabilities"),
178
178
  t("chat.inspectSuggestionHello"),
@@ -64,7 +64,7 @@ function pathForView(view?: string): string {
64
64
  case "settings":
65
65
  return "/settings";
66
66
  case "team":
67
- return "/settings#organization";
67
+ return "/settings/organization";
68
68
  default:
69
69
  return "/";
70
70
  }
@@ -133,7 +133,7 @@ function AppContent() {
133
133
  {t("root.commandSearch")}
134
134
  </CommandMenu.Item>
135
135
  <CommandMenu.Item
136
- onSelect={() => navigate("/settings#agent")}
136
+ onSelect={() => navigate("/settings/agent")}
137
137
  keywords={[
138
138
  "agent",
139
139
  "context",
@@ -21,20 +21,20 @@ export default function AgentRoute() {
21
21
  "learnings",
22
22
  ]);
23
23
  const destination = resourceTabs.has(legacyTab)
24
- ? `/settings#agent:resources:${legacyTab}`
24
+ ? `/settings/agent/resources/${legacyTab}`
25
25
  : legacyTab === "remote-agents"
26
- ? "/settings#agent:agents"
26
+ ? "/settings/agent/agents"
27
27
  : legacyTab === "connections"
28
- ? "/settings#integrations"
28
+ ? "/settings/integrations"
29
29
  : legacyTab === "jobs"
30
- ? "/settings#agent:automations"
30
+ ? "/settings/agent/automations"
31
31
  : legacyTab === "access"
32
- ? "/settings#agent:access"
32
+ ? "/settings/agent"
33
33
  : ["llm", "app-models", "limits", "voice", "background"].includes(
34
34
  legacyTab,
35
35
  )
36
- ? `/settings#${legacyTab}`
37
- : "/settings#agent";
36
+ ? `/settings/agent/${legacyTab}`
37
+ : "/settings/agent";
38
38
 
39
39
  return <Navigate to={destination} replace />;
40
40
  }
@@ -7,5 +7,5 @@ export function meta() {
7
7
  }
8
8
 
9
9
  export default function ExtensionsRoute() {
10
- return <Navigate to="/settings#extensions" replace />;
10
+ return <Navigate to="/settings/extensions" replace />;
11
11
  }
@@ -0,0 +1 @@
1
+ export { default, meta } from "./settings.js";
@@ -7,5 +7,5 @@ export function meta() {
7
7
  }
8
8
 
9
9
  export default function TeamRoute() {
10
- return <Navigate to="/settings#organization" replace />;
10
+ return <Navigate to="/settings/organization" replace />;
11
11
  }
@@ -38,7 +38,35 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
38
38
 
39
39
  Use web browsing only for public URLs. Auth-gated docs usually need their matching connector. For threads, read the parent and all replies; note when there are no replies, and inspect linked files or newer follow-ups when the source refers to them.
40
40
 
41
- 2. Decompose and categorize every actionable item.
41
+ 2. Check whether this defect has already been reported.
42
+
43
+ A feedback channel holds months of reports and nobody remembers all of them,
44
+ so the same defect gets filed by different people weeks apart and every
45
+ filing reads as new. One recorded case: the same Clips recording bug was
46
+ filed almost word-for-word 29 days apart by the same reporter, and neither
47
+ message mentions the other. Another defect was reported fifteen times by
48
+ nine people across three months, was announced as fixed once in the middle,
49
+ and was reported again two weeks later.
50
+
51
+ Search before fixing, going back at least three months: the source channel
52
+ in the reporter's words and in your own, Sentry, and merged PR titles. Search
53
+ the feature name, the error text, and the surface separately — repeat reports
54
+ rarely share vocabulary.
55
+
56
+ - **No prior report** — proceed normally.
57
+ - **Prior report, no fix landed** — say how long it has been open. The person
58
+ forwarding it to you is likely seeing it for the second time too.
59
+ - **Prior report, fix landed** — this is a regression, and the bar is now
60
+ different. Patching it again and reporting done is exactly how it returns a
61
+ third time. Find why the first fix stopped holding, and leave behind
62
+ something that fails when it breaks again: a test that reproduces the
63
+ user's path, or an assertion in the flow the report names.
64
+
65
+ Report the repeat explicitly, with dates and reporters. A defect on its third
66
+ report is not a bug ticket, it is a missing check — and the missing check is
67
+ the deliverable, not the patch.
68
+
69
+ 3. Decompose and categorize every actionable item.
42
70
 
43
71
  Build a compact checklist before changing code. For each item, record the
44
72
  symptom, expected behavior, evidence, and owning surface: UI, action/tool,
@@ -49,7 +77,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
49
77
  - **Question or unclear**: Missing detail, contradictory feedback, or behavior you cannot inspect. Ask or flag it.
50
78
  - **Out of scope**: Outside this repo, already shipped, intentionally unsupported, or too low-signal. Note briefly and skip.
51
79
 
52
- 3. For data, permissions, or resource-lifecycle feedback, verify the whole capability boundary before calling it UX.
80
+ 4. For data, permissions, or resource-lifecycle feedback, verify the whole capability boundary before calling it UX.
53
81
 
54
82
  - Check the supported create/read/update/delete lifecycle, including whether the backend/action exists when a UI control is missing.
55
83
  - Inspect both the UI and the shared action/tool surface so agent and UI behavior stay in parity.
@@ -57,7 +85,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
57
85
  - Treat possible cross-user or cross-organization exposure as a security/correctness bug and verify it before proposing polish.
58
86
  - Keep undefined product policy separate from implementation bugs. If supported source types or scope semantics are not defined, flag the contract question instead of inventing behavior.
59
87
 
60
- 4. Check Sentry when the feedback smells like an error.
88
+ 5. Check Sentry when the feedback smells like an error.
61
89
 
62
90
  - Use the Sentry skill/plugin if available, or the repo's Sentry scripts if documented.
63
91
  - Search by route, stack symbol, error text, and symptom keywords.
@@ -65,7 +93,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
65
93
  - Cite issue IDs or links when you find a match.
66
94
  - If nothing matches, say that plainly.
67
95
 
68
- 5. Fix only the clear bugs you agree with.
96
+ 6. Fix only the clear bugs you agree with.
69
97
 
70
98
  - Verify before fixing: reproduce locally, read the relevant code, inspect logs, or confirm with a stack trace.
71
99
  - Keep each fix narrow and mapped to a feedback item.
@@ -73,7 +101,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
73
101
  - Do not switch branches, stash, reset, force-push, or open a PR unless the user asks.
74
102
  - Add or update focused tests when the bug risk warrants it.
75
103
 
76
- 6. Treat UX feedback with restraint.
104
+ 7. Treat UX feedback with restraint.
77
105
 
78
106
  Do not solve UX problems by adding more visible controls, helper text, banners, top-level nav, or always-open panels by default. Prefer cleaner interaction models:
79
107
 
@@ -85,7 +113,7 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
85
113
 
86
114
  When proposing a UX change, write it as: what to change, why it helps, and the tradeoff. Keep each proposal short.
87
115
 
88
- 7. Verify changed behavior.
116
+ 8. Verify changed behavior.
89
117
 
90
118
  - Run the smallest relevant test or typecheck command.
91
119
  - For UI fixes, inspect the actual screen with a browser tool you already
@@ -100,6 +128,9 @@ The default posture is judgment plus action: fix clear, verified bugs you agree
100
128
  Keep the final report short:
101
129
 
102
130
  ```md
131
+ ## Repeat Reports
132
+ - [defect] - reported [N] times since [date] by [reporters]; [what now fails if it regresses]
133
+
103
134
  ## Bugs Fixed
104
135
  - [feedback item] - [what changed, file:line]
105
136
 
@@ -204,7 +204,7 @@ For public pages (share links, embeds, marketing pages) that need anonymous view
204
204
  ```ts
205
205
  const ret = window.location.pathname + window.location.search;
206
206
  window.location.href =
207
- "/_agent-native/sign-in?return=" + encodeURIComponent(ret);
207
+ "/sign-in?return=" + encodeURIComponent(ret);
208
208
  ```
209
209
 
210
210
  After successful sign-in (token / email-password / Google OAuth), the framework redirects to `return`. The path is validated as same-origin via the URL parser — open-redirect / header-injection inputs fall back to `/`.
@@ -230,7 +230,9 @@ will be rejected.
230
230
 
231
231
  `AppProviders` applies `RequireSession` automatically on its private branch. It
232
232
  resolves the session on the client and redirects signed-out visitors to
233
- `/_agent-native/sign-in?return=…` before mounting the routed shell:
233
+ `/sign-in?return=…` before mounting the routed shell. The legacy
234
+ `/_agent-native/sign-in` path remains supported for older generated apps and
235
+ bookmarks:
234
236
 
235
237
  ```tsx
236
238
  import { AppProviders } from "@agent-native/core/client/hooks";
@@ -1,62 +0,0 @@
1
- # Template Catalog And Demo Dashboards
2
-
3
- ## Listing And Installing Templates
4
-
5
- - `list-dashboard-templates` lists source-controlled dashboard templates with
6
- `id`, category, data sources, panel count, and installed dashboard IDs.
7
- - `install-dashboard-template` installs a catalog template into normal
8
- SQL-backed dashboards. Required: `templateId`. Optional: `dashboardId`,
9
- `name`, `overwrite`, `forceNew`, and `mergePanels` (see "Reliable Bulk
10
- Edits" in the main skill for the `mergePanels` append behavior).
11
-
12
- ## Canonical Agent Native Dashboard
13
-
14
- Keep the canonical Agent Native dashboard (`agent-native-templates-first-party`)
15
- focused: it includes one explicit feedback-sentiment-by-model chart and one
16
- optional inferred-message-sentiment chart, not the broader LLM cost, token,
17
- latency, or error suite.
18
-
19
- - Explicit feedback uses content-free `$ai_feedback` events with `sentiment`
20
- (`positive` or `negative`) and model in `$ai_model` or `model`.
21
- - Inferred sentiment uses `$ai_sentiment` events with `method = 'llm'` and
22
- `sentiment` (`positive`, `neutral`, or `negative`).
23
-
24
- Keep these panels in the canonical dashboard and do not recreate a separately
25
- installable observability template.
26
-
27
- ## Node Exporter Templates
28
-
29
- Node Exporter ships as `node-exporter-macos` (Darwin/Homebrew `node_exporter`
30
- scrapes) and `node-exporter-full` (the Linux-focused Grafana 1860 revision 45
31
- dashboard converted into native Analytics panels, plus Prometheus
32
- Observability Demo app metrics — `demo_http_*`, `demo_chaos_mode`, synthetic
33
- CPU/disk/memory workload metrics). See the `prometheus` skill for the full
34
- panel/field breakdown and local Homebrew setup.
35
-
36
- Keep the first-open `App / Overview` tab light: it should show the Request
37
- Latency highlight plus current app state, while Traffic, Latency, and
38
- Workload details stay split across their own `App / *` tabs.
39
-
40
- ## Demo Dashboard
41
-
42
- - `ensure-demo-dashboards` installs one private per-user demo on first app
43
- open: `demo-node-exporter`. The Analytics root route calls this before
44
- honoring local last-opened state; when the action creates the demo, the
45
- user should land directly on the Node Exporter demo's `App / Overview` tab
46
- without visiting the template catalog or data-source setup.
47
- - The demo dashboard is generated from the same `node-exporter-full` seed as
48
- the catalog template. Its Prometheus panels keep the same PromQL
49
- descriptors and use `source: "demo"` so queries route to the demo
50
- Prometheus endpoint instead of the user's `PROMETHEUS_*` credential slot.
51
- - The demo Prometheus endpoint defaults to the public read-only
52
- `https://prometheus.agent-native.foo`, so cloud and local MPX installs work
53
- without user setup. Deployments can override it with
54
- `ANALYTICS_DEMO_PROMETHEUS_URL` and optional
55
- `ANALYTICS_DEMO_PROMETHEUS_USERNAME`, `ANALYTICS_DEMO_PROMETHEUS_PASSWORD`,
56
- or `ANALYTICS_DEMO_PROMETHEUS_BEARER_TOKEN`. Do not put credential values
57
- in source, docs, fixtures, tests, prompts, or dashboard seeds.
58
- - Demo dashboards are ordinary SQL dashboard rows, so rename, share, archive,
59
- and delete flows apply. Deleted demo IDs are tombstoned in SQL settings and
60
- are not recreated unless the user explicitly asks to reset demos.
61
- - Use `ensure-demo-dashboards --reset=true` only when the user asks to
62
- restore a deleted or changed demo dashboard.