@agent-native/core 0.98.1 → 0.98.3

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 (165) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +18 -0
  3. package/corpus/core/docs/content/locales/ar-SA/pr-visual-recap.mdx +25 -1
  4. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +1 -1
  5. package/corpus/core/docs/content/locales/de-DE/pr-visual-recap.mdx +25 -1
  6. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +1 -1
  7. package/corpus/core/docs/content/locales/es-ES/pr-visual-recap.mdx +25 -1
  8. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +1 -1
  9. package/corpus/core/docs/content/locales/fr-FR/pr-visual-recap.mdx +25 -1
  10. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +1 -1
  11. package/corpus/core/docs/content/locales/hi-IN/pr-visual-recap.mdx +25 -1
  12. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +1 -1
  13. package/corpus/core/docs/content/locales/ja-JP/pr-visual-recap.mdx +25 -1
  14. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +1 -1
  15. package/corpus/core/docs/content/locales/ko-KR/pr-visual-recap.mdx +25 -1
  16. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +1 -1
  17. package/corpus/core/docs/content/locales/pt-BR/pr-visual-recap.mdx +25 -1
  18. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +1 -1
  19. package/corpus/core/docs/content/locales/zh-CN/pr-visual-recap.mdx +25 -1
  20. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +1 -1
  21. package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.mdx +25 -1
  22. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +1 -1
  23. package/corpus/core/docs/content/pr-visual-recap.mdx +50 -1
  24. package/corpus/core/docs/content/template-plan.mdx +1 -1
  25. package/corpus/core/package.json +1 -1
  26. package/corpus/core/src/agent/production-agent.ts +2 -2
  27. package/corpus/core/src/cli/plan-local.ts +43 -11
  28. package/corpus/core/src/cli/pr-visual-recap-workflow.ts +2 -9
  29. package/corpus/core/src/cli/recap.ts +356 -4
  30. package/corpus/core/src/cli/skills-content/local-files.ts +17 -12
  31. package/corpus/core/src/client/analytics.ts +96 -14
  32. package/corpus/core/src/client/index.ts +7 -0
  33. package/corpus/core/src/client/session-replay.ts +10 -0
  34. package/corpus/core/src/client/settings/DemoModeSection.tsx +10 -34
  35. package/corpus/core/src/client/settings/SettingsPanel.tsx +31 -211
  36. package/corpus/core/src/client/settings/agent-settings-search.ts +219 -0
  37. package/corpus/core/src/client/settings/index.ts +4 -0
  38. package/corpus/core/src/client/url-scrub.ts +13 -0
  39. package/corpus/core/src/client/use-demo-mode-status.ts +44 -0
  40. package/corpus/core/src/demo/actions/toggle-demo-mode.ts +2 -2
  41. package/corpus/core/src/demo/config.ts +6 -6
  42. package/corpus/core/src/demo/redact.ts +18 -76
  43. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +21 -4
  44. package/corpus/templates/analytics/AGENTS.md +8 -0
  45. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +18 -4
  46. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +429 -244
  47. package/corpus/templates/analytics/app/components/layout/command-palette-search.ts +93 -0
  48. package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +2 -1
  49. package/corpus/templates/analytics/app/lib/demo-chart-trend.ts +169 -0
  50. package/corpus/templates/analytics/app/pages/Settings.tsx +8 -45
  51. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +205 -70
  52. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +32 -16
  53. package/corpus/templates/analytics/app/pages/settings/settings-search.ts +126 -0
  54. package/corpus/templates/analytics/changelog/2026-07-12-command-menu-loading-placeholders-now-stay-below-available-r.md +6 -0
  55. package/corpus/templates/analytics/changelog/2026-07-12-command-menu-search-now-prioritizes-the-best-match.md +6 -0
  56. package/corpus/templates/analytics/changelog/2026-07-12-daily-dashboard-emails-reliably-include-the-complete-dashboa.md +6 -0
  57. package/corpus/templates/analytics/changelog/2026-07-12-demo-charts-preserve-source-movement.md +6 -0
  58. package/corpus/templates/analytics/changelog/2026-07-12-demo-mode-charts-trend-upward.md +6 -0
  59. package/corpus/templates/analytics/changelog/2026-07-12-replay-storage-settings-stay-readable-at-narrow-widths.md +6 -0
  60. package/corpus/templates/analytics/changelog/2026-07-12-session-replays-preserve-recorded-styling-and-keep-malformed.md +6 -0
  61. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +2 -0
  62. package/corpus/templates/analytics/server/lib/dashboard-report.ts +17 -33
  63. package/corpus/templates/clips/app/components/player/video-player.tsx +5 -1
  64. package/corpus/templates/clips/changelog/2026-07-11-clips-no-longer-stay-stuck-on-preparing-clip-when-they-are-r.md +6 -0
  65. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +2 -2
  66. package/corpus/templates/content/changelog/2026-07-12-the-left-sidebar-stays-fixed-horizontally-while-scrolling-on.md +6 -0
  67. package/corpus/templates/plan/.agents/skills/visual-plan/references/local-files.md +17 -12
  68. package/corpus/templates/plan/.agents/skills/visual-recap/references/local-files.md +17 -12
  69. package/corpus/templates/plan/actions/validate-local-plan-source.ts +4 -4
  70. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -1
  71. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +41 -0
  72. package/corpus/templates/plan/app/lib/plan-tracking.ts +3 -0
  73. package/corpus/templates/plan/app/pages/PlansPage.tsx +9 -9
  74. package/corpus/templates/plan/app/root.tsx +13 -3
  75. package/corpus/templates/plan/changelog/2026-07-12-local-plan-source-now-stays-on-device.md +6 -0
  76. package/dist/agent/production-agent.js +2 -2
  77. package/dist/agent/production-agent.js.map +1 -1
  78. package/dist/cli/plan-local.d.ts +6 -6
  79. package/dist/cli/plan-local.d.ts.map +1 -1
  80. package/dist/cli/plan-local.js +36 -7
  81. package/dist/cli/plan-local.js.map +1 -1
  82. package/dist/cli/pr-visual-recap-workflow.d.ts +2 -8
  83. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  84. package/dist/cli/pr-visual-recap-workflow.js +2 -8
  85. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  86. package/dist/cli/recap.d.ts +22 -1
  87. package/dist/cli/recap.d.ts.map +1 -1
  88. package/dist/cli/recap.js +286 -2
  89. package/dist/cli/recap.js.map +1 -1
  90. package/dist/cli/skills-content/local-files.d.ts +1 -1
  91. package/dist/cli/skills-content/local-files.d.ts.map +1 -1
  92. package/dist/cli/skills-content/local-files.js +17 -12
  93. package/dist/cli/skills-content/local-files.js.map +1 -1
  94. package/dist/client/analytics.d.ts +8 -0
  95. package/dist/client/analytics.d.ts.map +1 -1
  96. package/dist/client/analytics.js +77 -13
  97. package/dist/client/analytics.js.map +1 -1
  98. package/dist/client/index.d.ts +3 -2
  99. package/dist/client/index.d.ts.map +1 -1
  100. package/dist/client/index.js +3 -2
  101. package/dist/client/index.js.map +1 -1
  102. package/dist/client/session-replay.d.ts +2 -0
  103. package/dist/client/session-replay.d.ts.map +1 -1
  104. package/dist/client/session-replay.js +7 -0
  105. package/dist/client/session-replay.js.map +1 -1
  106. package/dist/client/settings/DemoModeSection.d.ts +3 -3
  107. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  108. package/dist/client/settings/DemoModeSection.js +8 -27
  109. package/dist/client/settings/DemoModeSection.js.map +1 -1
  110. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  111. package/dist/client/settings/SettingsPanel.js +41 -191
  112. package/dist/client/settings/SettingsPanel.js.map +1 -1
  113. package/dist/client/settings/agent-settings-search.d.ts +16 -0
  114. package/dist/client/settings/agent-settings-search.d.ts.map +1 -0
  115. package/dist/client/settings/agent-settings-search.js +178 -0
  116. package/dist/client/settings/agent-settings-search.js.map +1 -0
  117. package/dist/client/settings/index.d.ts +1 -0
  118. package/dist/client/settings/index.d.ts.map +1 -1
  119. package/dist/client/settings/index.js +1 -0
  120. package/dist/client/settings/index.js.map +1 -1
  121. package/dist/client/url-scrub.d.ts.map +1 -1
  122. package/dist/client/url-scrub.js +14 -0
  123. package/dist/client/url-scrub.js.map +1 -1
  124. package/dist/client/use-demo-mode-status.d.ts +12 -0
  125. package/dist/client/use-demo-mode-status.d.ts.map +1 -0
  126. package/dist/client/use-demo-mode-status.js +30 -0
  127. package/dist/client/use-demo-mode-status.js.map +1 -0
  128. package/dist/collab/routes.d.ts +2 -2
  129. package/dist/demo/actions/toggle-demo-mode.js +2 -2
  130. package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
  131. package/dist/demo/config.js +6 -6
  132. package/dist/demo/config.js.map +1 -1
  133. package/dist/demo/redact.d.ts +7 -5
  134. package/dist/demo/redact.d.ts.map +1 -1
  135. package/dist/demo/redact.js +19 -54
  136. package/dist/demo/redact.js.map +1 -1
  137. package/dist/notifications/routes.d.ts +2 -2
  138. package/dist/observability/routes.d.ts +5 -5
  139. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  140. package/dist/secrets/routes.d.ts +9 -9
  141. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  142. package/dist/server/transcribe-voice.d.ts +1 -1
  143. package/docs/content/locales/ar-SA/pr-visual-recap.mdx +25 -1
  144. package/docs/content/locales/ar-SA/template-plan.mdx +1 -1
  145. package/docs/content/locales/de-DE/pr-visual-recap.mdx +25 -1
  146. package/docs/content/locales/de-DE/template-plan.mdx +1 -1
  147. package/docs/content/locales/es-ES/pr-visual-recap.mdx +25 -1
  148. package/docs/content/locales/es-ES/template-plan.mdx +1 -1
  149. package/docs/content/locales/fr-FR/pr-visual-recap.mdx +25 -1
  150. package/docs/content/locales/fr-FR/template-plan.mdx +1 -1
  151. package/docs/content/locales/hi-IN/pr-visual-recap.mdx +25 -1
  152. package/docs/content/locales/hi-IN/template-plan.mdx +1 -1
  153. package/docs/content/locales/ja-JP/pr-visual-recap.mdx +25 -1
  154. package/docs/content/locales/ja-JP/template-plan.mdx +1 -1
  155. package/docs/content/locales/ko-KR/pr-visual-recap.mdx +25 -1
  156. package/docs/content/locales/ko-KR/template-plan.mdx +1 -1
  157. package/docs/content/locales/pt-BR/pr-visual-recap.mdx +25 -1
  158. package/docs/content/locales/pt-BR/template-plan.mdx +1 -1
  159. package/docs/content/locales/zh-CN/pr-visual-recap.mdx +25 -1
  160. package/docs/content/locales/zh-CN/template-plan.mdx +1 -1
  161. package/docs/content/locales/zh-TW/pr-visual-recap.mdx +25 -1
  162. package/docs/content/locales/zh-TW/template-plan.mdx +1 -1
  163. package/docs/content/pr-visual-recap.mdx +50 -1
  164. package/docs/content/template-plan.mdx +1 -1
  165. package/package.json +2 -2
@@ -26,3 +26,96 @@ export function commandPaletteKeywords(
26
26
 
27
27
  return Array.from(variants);
28
28
  }
29
+
30
+ function normalizeSearchText(value: string): string {
31
+ return value
32
+ .normalize("NFKD")
33
+ .replace(/[\u0300-\u036f]/g, "")
34
+ .toLowerCase()
35
+ .replace(/[^\p{L}\p{N}]+/gu, " ")
36
+ .trim();
37
+ }
38
+
39
+ function fuzzySubsequenceScore(candidate: string, query: string): number {
40
+ const compactCandidate = candidate.replace(/\s/g, "");
41
+ const compactQuery = query.replace(/\s/g, "");
42
+ let queryIndex = 0;
43
+
44
+ for (const character of compactCandidate) {
45
+ if (character === compactQuery[queryIndex]) queryIndex += 1;
46
+ if (queryIndex === compactQuery.length) {
47
+ return 0.2 * (compactQuery.length / compactCandidate.length);
48
+ }
49
+ }
50
+
51
+ return 0;
52
+ }
53
+
54
+ export function commandPaletteFilter(
55
+ value: string,
56
+ search: string,
57
+ keywords: string[] = [],
58
+ ): number {
59
+ const query = normalizeSearchText(search);
60
+ if (!query) return 1;
61
+
62
+ const queryWords = query.split(" ");
63
+ let bestScore = 0;
64
+
65
+ for (const rawCandidate of [...keywords, value]) {
66
+ const candidate = normalizeSearchText(rawCandidate);
67
+ if (!candidate) continue;
68
+
69
+ const words = candidate.split(" ");
70
+ let score = 0;
71
+
72
+ if (candidate === query) score = 1;
73
+ else if (candidate.startsWith(query)) score = 0.96;
74
+ else if (words.includes(query)) score = 0.94;
75
+ else if (words.some((word) => word.startsWith(query))) score = 0.9;
76
+ else if (candidate.includes(query)) score = 0.8;
77
+ else if (
78
+ queryWords.every((queryWord) =>
79
+ words.some((word) => word.startsWith(queryWord)),
80
+ )
81
+ ) {
82
+ score = 0.72;
83
+ } else {
84
+ score = fuzzySubsequenceScore(candidate, query);
85
+ }
86
+
87
+ bestScore = Math.max(bestScore, score);
88
+ }
89
+
90
+ return bestScore;
91
+ }
92
+
93
+ export function rankCommandPaletteEntries<T>(
94
+ entries: T[],
95
+ search: string,
96
+ getSearchData: (entry: T) => { value: string; keywords?: string[] },
97
+ ): Array<{ entry: T; score: number }> {
98
+ return entries
99
+ .map((entry, index) => {
100
+ const { value, keywords } = getSearchData(entry);
101
+ return {
102
+ entry,
103
+ index,
104
+ score: commandPaletteFilter(value, search, keywords),
105
+ };
106
+ })
107
+ .filter(({ score }) => score > 0)
108
+ .sort((a, b) => b.score - a.score || a.index - b.index)
109
+ .map(({ entry, score }) => ({ entry, score }));
110
+ }
111
+
112
+ export function uniqueCommandItems<T extends { id: string; name: string }>(
113
+ items: T[],
114
+ ): T[] {
115
+ const seenIds = new Set<string>();
116
+ return items.filter((item) => {
117
+ if (seenIds.has(item.id)) return false;
118
+ seenIds.add(item.id);
119
+ return true;
120
+ });
121
+ }
@@ -46,11 +46,12 @@ export async function fetchReplayStorageStatus(): Promise<ReplayStorageStatus> {
46
46
  };
47
47
  }
48
48
 
49
- export function useReplayStorageStatus() {
49
+ export function useReplayStorageStatus(options?: { enabled?: boolean }) {
50
50
  return useQuery({
51
51
  queryKey: REPLAY_STORAGE_STATUS_KEY,
52
52
  queryFn: fetchReplayStorageStatus,
53
53
  staleTime: 60_000,
54
+ enabled: options?.enabled,
54
55
  });
55
56
  }
56
57
 
@@ -0,0 +1,169 @@
1
+ type DemoTrendSeed = string | number;
2
+
3
+ function hashSeed(seed: string): number {
4
+ let hash = 2166136261;
5
+ for (let index = 0; index < seed.length; index += 1) {
6
+ hash ^= seed.charCodeAt(index);
7
+ hash = Math.imul(hash, 16777619);
8
+ }
9
+ return hash >>> 0;
10
+ }
11
+
12
+ function createRandom(seed: string): () => number {
13
+ let state = hashSeed(seed);
14
+ return () => {
15
+ state += 0x6d2b79f5;
16
+ let value = state;
17
+ value = Math.imul(value ^ (value >>> 15), value | 1);
18
+ value ^= value + Math.imul(value ^ (value >>> 7), value | 61);
19
+ return ((value ^ (value >>> 14)) >>> 0) / 4294967296;
20
+ };
21
+ }
22
+
23
+ function clamp(value: number, minimum: number, maximum: number): number {
24
+ return Math.min(maximum, Math.max(minimum, value));
25
+ }
26
+
27
+ function numericValue(value: unknown): number | null {
28
+ if (typeof value === "number") return Number.isFinite(value) ? value : null;
29
+ if (typeof value !== "string" || value.trim() === "") return null;
30
+ const numeric = Number(value);
31
+ return Number.isFinite(numeric) ? numeric : null;
32
+ }
33
+
34
+ function normalizedVolatility(
35
+ series: number[],
36
+ minimum: number,
37
+ range: number,
38
+ ) {
39
+ if (series.length < 3 || range === 0) return 0;
40
+ const normalized = series.map((value) => (value - minimum) / range);
41
+ const averageStep =
42
+ (normalized[normalized.length - 1] - normalized[0]) /
43
+ (normalized.length - 1);
44
+ const deviation = normalized
45
+ .slice(1)
46
+ .reduce(
47
+ (total, value, index) =>
48
+ total + Math.abs(value - normalized[index] - averageStep),
49
+ 0,
50
+ );
51
+ return clamp((deviation / (normalized.length - 1)) * 1.4, 0, 1);
52
+ }
53
+
54
+ function normalizedTrend(
55
+ series: number[],
56
+ minimum: number,
57
+ range: number,
58
+ volatilityScore: number,
59
+ random: () => number,
60
+ ): number[] {
61
+ const length = series.length;
62
+ if (length <= 1) return [0];
63
+ if (length === 2) return [0, 1];
64
+
65
+ const normalized = series.map((value) => (value - minimum) / range);
66
+ const randomization = 0.012 + volatilityScore * 0.08;
67
+ const shape = [normalized[0]];
68
+
69
+ // Preserve the source's actual step pattern (including when and how sharply
70
+ // it spikes), with just enough seeded variation that otherwise-similar demo
71
+ // series do not become identical. Smooth sources receive almost no jitter;
72
+ // volatile sources can vary a little more without moving their events.
73
+ for (let index = 1; index < length; index += 1) {
74
+ const sourceStep = normalized[index] - normalized[index - 1];
75
+ const factor = 1 + (random() * 2 - 1) * randomization;
76
+ shape.push(shape[index - 1] + sourceStep * factor);
77
+ }
78
+
79
+ // Add only the linear drift required for the first point to be the global
80
+ // minimum and the last to be the global maximum. A linear term has zero
81
+ // second difference, so the source's local acceleration, spikes, and dips
82
+ // survive instead of being replaced by a synthetic random walk.
83
+ let requiredDrift = 0;
84
+ for (let index = 1; index < length; index += 1) {
85
+ const progress = index / (length - 1);
86
+ requiredDrift = Math.max(
87
+ requiredDrift,
88
+ (shape[0] - shape[index]) / progress,
89
+ );
90
+ }
91
+ for (let index = 0; index < length - 1; index += 1) {
92
+ const progress = index / (length - 1);
93
+ requiredDrift = Math.max(
94
+ requiredDrift,
95
+ (shape[index] - shape[length - 1]) / (1 - progress),
96
+ );
97
+ }
98
+
99
+ const drift = requiredDrift + 0.012 + random() * 0.018;
100
+ const candidate = shape.map(
101
+ (value, index) => value + drift * (index / (length - 1)),
102
+ );
103
+ const candidateRange = candidate[length - 1] - candidate[0];
104
+ return candidate.map((value) => (value - candidate[0]) / candidateRange);
105
+ }
106
+
107
+ /**
108
+ * Replace numeric chart series with a stable, seeded upward trend while
109
+ * retaining the query's original range and every non-series field. This is a
110
+ * presentation-only demo-mode transform: callers keep the real query result
111
+ * and opt individual line/area renderers into the returned rows.
112
+ */
113
+ export function createDemoChartTrendRows(
114
+ rows: Record<string, unknown>[],
115
+ yKeys: string[],
116
+ seed: DemoTrendSeed,
117
+ ): Record<string, unknown>[] {
118
+ if (rows.length === 0 || yKeys.length === 0) return rows;
119
+
120
+ let output: Record<string, unknown>[] | null = null;
121
+
122
+ for (const yKey of yKeys) {
123
+ const points = rows.flatMap((row, rowIndex) => {
124
+ const numeric = numericValue(row[yKey]);
125
+ return numeric === null
126
+ ? []
127
+ : [{ rowIndex, numeric, original: row[yKey] }];
128
+ });
129
+
130
+ if (points.length < 2) continue;
131
+
132
+ const minimum = Math.min(...points.map((point) => point.numeric));
133
+ const maximum = Math.max(...points.map((point) => point.numeric));
134
+ if (minimum === maximum) continue;
135
+
136
+ const random = createRandom(`${String(seed)}:${yKey}`);
137
+ const range = maximum - minimum;
138
+ const volatilityScore = normalizedVolatility(
139
+ points.map((point) => point.numeric),
140
+ minimum,
141
+ range,
142
+ );
143
+ const trend = normalizedTrend(
144
+ points.map((point) => point.numeric),
145
+ minimum,
146
+ range,
147
+ volatilityScore,
148
+ random,
149
+ );
150
+ const useStringValues = points.every(
151
+ (point) => typeof point.original === "string",
152
+ );
153
+
154
+ output ??= rows.map((row) => ({ ...row }));
155
+ points.forEach((point, pointIndex) => {
156
+ const numeric =
157
+ pointIndex === 0
158
+ ? minimum
159
+ : pointIndex === points.length - 1
160
+ ? maximum
161
+ : minimum + trend[pointIndex] * range;
162
+ output![point.rowIndex][yKey] = useStringValues
163
+ ? String(numeric)
164
+ : numeric;
165
+ });
166
+ }
167
+
168
+ return output ?? rows;
169
+ }
@@ -5,7 +5,6 @@ import {
5
5
  useAgentSettingsTabs,
6
6
  useSession,
7
7
  useT,
8
- type SettingsSearchEntry,
9
8
  type SettingsTabItem,
10
9
  } from "@agent-native/core/client";
11
10
  import { TeamPage } from "@agent-native/core/client/org";
@@ -27,6 +26,7 @@ import changelog from "../../CHANGELOG.md?raw";
27
26
  import { useReplayStorageStatus } from "../hooks/use-replay-storage-status";
28
27
  import { ReplayStorageHint } from "./sessions/SessionsPage";
29
28
  import { AlertRulesSettingsCard } from "./settings/AlertRulesSettingsCard";
29
+ import { buildAnalyticsGeneralSettingsSearchEntries } from "./settings/settings-search";
30
30
 
31
31
  export default function Settings() {
32
32
  // Settings is also reachable directly from the full-page agent surface.
@@ -56,49 +56,12 @@ export default function Settings() {
56
56
  [agentSettingsTabs, t],
57
57
  );
58
58
 
59
- const generalSearchEntries = useMemo<SettingsSearchEntry[]>(
60
- () => [
61
- {
62
- id: "analytics-account",
63
- label: t("settings.account"),
64
- keywords: "profile email signed in identity",
65
- hash: "account",
66
- },
67
- {
68
- id: "analytics-credentials",
69
- label: t("settings.credentials"),
70
- keywords: "data sources api keys manage credentials",
71
- hash: "credentials",
72
- },
73
- {
74
- id: "analytics-dashboard-templates",
75
- label: t("settings.dashboardTemplates"),
76
- keywords: "templates catalog dashboards",
77
- hash: "dashboard-templates",
78
- },
79
- ...(replayStorageStatus.data?.configured
80
- ? [
81
- {
82
- id: "analytics-replay-storage",
83
- label: t("sessions.storageSetupTitle"),
84
- keywords: "session replay recording storage s3 bucket builder",
85
- hash: "replay-storage",
86
- },
87
- ]
88
- : []),
89
- {
90
- id: "analytics-language",
91
- label: t("settings.languageTitle"),
92
- keywords: "language locale translation i18n",
93
- hash: "language",
94
- },
95
- {
96
- id: "analytics-about",
97
- label: t("settings.about"),
98
- keywords: "about version info usage",
99
- hash: "about",
100
- },
101
- ],
59
+ const generalSearchEntries = useMemo(
60
+ () =>
61
+ buildAnalyticsGeneralSettingsSearchEntries(
62
+ t,
63
+ !!replayStorageStatus.data?.configured,
64
+ ),
102
65
  [replayStorageStatus.data?.configured, t],
103
66
  );
104
67
 
@@ -184,7 +147,7 @@ export default function Settings() {
184
147
  </CardDescription>
185
148
  </CardHeader>
186
149
  <CardContent>
187
- <ReplayStorageHint />
150
+ <ReplayStorageHint embedded />
188
151
  </CardContent>
189
152
  </Card>
190
153
  ) : null}