blume 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +28 -0
  3. package/README.md +2 -2
  4. package/dist/cli/{chunk-f7t03s3g.js → chunk-27g6wdth.js} +2 -2
  5. package/dist/cli/{chunk-mnqj32sj.js → chunk-2hn4b8z7.js} +13 -13
  6. package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
  7. package/dist/cli/{chunk-by2290sx.js → chunk-5shv93fd.js} +2 -2
  8. package/dist/cli/{chunk-a9kptbw5.js → chunk-6crbhc3x.js} +3 -3
  9. package/dist/cli/{chunk-a9kptbw5.js.map → chunk-6crbhc3x.js.map} +1 -1
  10. package/dist/cli/{chunk-mwt1k8n7.js → chunk-6hsn950k.js} +20 -20
  11. package/dist/cli/chunk-6hsn950k.js.map +10 -0
  12. package/dist/cli/{chunk-11j0384y.js → chunk-6vm74dry.js} +13 -13
  13. package/dist/cli/{chunk-11j0384y.js.map → chunk-6vm74dry.js.map} +3 -3
  14. package/dist/cli/{chunk-j8mw0za6.js → chunk-79jhk4py.js} +8 -8
  15. package/dist/cli/{chunk-j8mw0za6.js.map → chunk-79jhk4py.js.map} +2 -2
  16. package/dist/cli/{chunk-nk3ts2xk.js → chunk-82bbrxdn.js} +2 -2
  17. package/dist/cli/{chunk-2q1dwty4.js → chunk-ah61y8py.js} +8 -8
  18. package/dist/cli/{chunk-2q1dwty4.js.map → chunk-ah61y8py.js.map} +4 -4
  19. package/dist/cli/{chunk-zxccj738.js → chunk-ce574jw2.js} +1 -1
  20. package/dist/cli/{chunk-y3e45rc8.js → chunk-ch6g3ar0.js} +3 -3
  21. package/dist/cli/{chunk-beat36xx.js → chunk-dh8cwk36.js} +5 -5
  22. package/dist/cli/{chunk-beat36xx.js.map → chunk-dh8cwk36.js.map} +2 -2
  23. package/dist/cli/{chunk-1w8dp3qb.js → chunk-epjnccmv.js} +13 -13
  24. package/dist/cli/{chunk-ernrthtr.js → chunk-f2z5v128.js} +13 -13
  25. package/dist/cli/{chunk-zg2gtj10.js → chunk-fs23ddbb.js} +2 -2
  26. package/dist/cli/{chunk-7ez8ny0t.js → chunk-fxypxtvm.js} +2 -2
  27. package/dist/cli/{chunk-tzne8qfq.js → chunk-fz5wtpmh.js} +13 -13
  28. package/dist/cli/{chunk-b5aj94ah.js → chunk-hdpx1tax.js} +4 -4
  29. package/dist/cli/{chunk-d80hr03s.js → chunk-jwyddg7y.js} +9 -9
  30. package/dist/cli/{chunk-d80hr03s.js.map → chunk-jwyddg7y.js.map} +2 -2
  31. package/dist/cli/{chunk-fh5hj5jt.js → chunk-kdp5q7ke.js} +15 -15
  32. package/dist/cli/{chunk-6k8vp3ta.js → chunk-kpf8rrjc.js} +9 -9
  33. package/dist/cli/{chunk-6k8vp3ta.js.map → chunk-kpf8rrjc.js.map} +3 -3
  34. package/dist/cli/{chunk-5a2z0198.js → chunk-m3vmjgmq.js} +9 -9
  35. package/dist/cli/{chunk-5a2z0198.js.map → chunk-m3vmjgmq.js.map} +2 -2
  36. package/dist/cli/{chunk-bctazmbk.js → chunk-mb2919y2.js} +4 -4
  37. package/dist/cli/{chunk-79njf86q.js → chunk-q5163e60.js} +13 -13
  38. package/dist/cli/{chunk-xaz13gwg.js → chunk-qkqwkpte.js} +196 -208
  39. package/dist/cli/{chunk-xaz13gwg.js.map → chunk-qkqwkpte.js.map} +48 -48
  40. package/dist/cli/{chunk-sqn5t4q0.js → chunk-qs4q5p4e.js} +3 -3
  41. package/dist/cli/{chunk-bw22s759.js → chunk-qwsrynx5.js} +1 -1
  42. package/dist/cli/{chunk-z01ze5c1.js → chunk-s1p84fyh.js} +15 -15
  43. package/dist/cli/{chunk-pnnvybbk.js → chunk-s6jhgk0q.js} +5 -5
  44. package/dist/cli/{chunk-pnnvybbk.js.map → chunk-s6jhgk0q.js.map} +2 -2
  45. package/dist/cli/{chunk-f2972sbt.js → chunk-vtk4a6dg.js} +1 -1
  46. package/dist/cli/{chunk-z1f5arsg.js → chunk-wgm7m9qk.js} +21 -21
  47. package/dist/cli/{chunk-z1f5arsg.js.map → chunk-wgm7m9qk.js.map} +4 -4
  48. package/dist/cli/{chunk-bnbmcwfb.js → chunk-wm7js3j9.js} +5 -5
  49. package/dist/cli/{chunk-bnbmcwfb.js.map → chunk-wm7js3j9.js.map} +3 -3
  50. package/dist/cli/{chunk-d1tadaw7.js → chunk-yt5n7ppj.js} +3 -3
  51. package/dist/cli/{chunk-pat2zzwc.js → chunk-yw7dm696.js} +1 -1
  52. package/dist/cli/{chunk-pat2zzwc.js.map → chunk-yw7dm696.js.map} +1 -1
  53. package/dist/cli/{chunk-88cpgt6h.js → chunk-zxcczpyx.js} +1 -1
  54. package/dist/cli/{chunk-41za066z.js → chunk-zxh4d9vy.js} +4 -4
  55. package/dist/cli/index.js +17 -17
  56. package/dist/types/ai/agent-readability.d.ts +1 -1
  57. package/dist/types/ai/api/paths.d.ts +1 -1
  58. package/dist/types/ai/ask-context.d.ts +7 -7
  59. package/dist/types/ai/ask.d.ts +43 -43
  60. package/dist/types/ai/index.d.ts +3 -3
  61. package/dist/types/ai/openapi-components.d.ts +1 -1
  62. package/dist/types/ai/serializers.d.ts +1 -1
  63. package/dist/types/ai/visibility.d.ts +1 -1
  64. package/dist/types/core/config-input.d.ts +17 -17
  65. package/dist/types/core/config.d.ts +3 -3
  66. package/dist/types/core/data.d.ts +3 -3
  67. package/dist/types/core/i18n-ui.d.ts +6 -8
  68. package/dist/types/core/schema.d.ts +5 -5
  69. package/dist/types/core/unrecognized-keys.d.ts +1 -1
  70. package/dist/types/search/documents.d.ts +1 -1
  71. package/dist/types/search/orama-index.d.ts +1 -1
  72. package/docs/02-deployment.mdx +4 -4
  73. package/docs/03-upgrading.mdx +22 -9
  74. package/docs/04-migrating.mdx +4 -4
  75. package/docs/08-faq.mdx +3 -3
  76. package/docs/advanced/custom-pages.mdx +2 -2
  77. package/docs/advanced/skills.mdx +1 -1
  78. package/docs/cli/audit.mdx +3 -3
  79. package/docs/cli/doctor.mdx +3 -3
  80. package/docs/cli/evals.mdx +7 -7
  81. package/docs/cli/index.mdx +2 -2
  82. package/docs/cli/translate.mdx +8 -8
  83. package/docs/configuration/{ask-ai.mdx → assistant.mdx} +19 -19
  84. package/docs/configuration/customization.mdx +2 -2
  85. package/docs/configuration/index.mdx +2 -2
  86. package/docs/configuration/meta.ts +1 -1
  87. package/docs/configuration/search.mdx +1 -1
  88. package/docs/content/i18n.mdx +2 -2
  89. package/docs/content/islands.mdx +1 -1
  90. package/docs/discoverability/agent-discovery.mdx +1 -1
  91. package/docs/discoverability/index.mdx +1 -1
  92. package/docs/index.mdx +2 -2
  93. package/package.json +1 -1
  94. package/skills/blume/SKILL.md +5 -5
  95. package/skills/blume-migrate/SKILL.md +2 -2
  96. package/src/ai/agent-readability.ts +4 -4
  97. package/src/ai/api/paths.ts +1 -1
  98. package/src/ai/ask-context.ts +7 -7
  99. package/src/ai/ask-data.ts +2 -2
  100. package/src/ai/ask.ts +84 -71
  101. package/src/ai/cors.ts +3 -3
  102. package/src/ai/index.ts +16 -16
  103. package/src/ai/openapi-components.ts +1 -1
  104. package/src/ai/serializers.ts +1 -1
  105. package/src/ai/visibility.ts +1 -1
  106. package/src/astro/generate.ts +19 -18
  107. package/src/astro/module-types.ts +1 -1
  108. package/src/astro/runtime-deps.ts +6 -6
  109. package/src/astro/templates.ts +26 -26
  110. package/src/blume-modules.d.ts +2 -2
  111. package/src/cli/commands/audit.ts +1 -1
  112. package/src/cli/commands/doctor.ts +7 -5
  113. package/src/cli/commands/eval.ts +3 -3
  114. package/src/cli/commands/migrate.ts +2 -2
  115. package/src/cli/commands/translate.ts +3 -3
  116. package/src/cli/commands/upgrade.ts +2 -2
  117. package/src/cli/required-secrets.ts +3 -3
  118. package/src/components/copy-feedback.ts +1 -1
  119. package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
  120. package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
  121. package/src/components/islands/hooks.ts +14 -12
  122. package/src/components/layout/Header.astro +10 -10
  123. package/src/components/layout/PageLayout.astro +6 -6
  124. package/src/components/layout/Pagination.astro +7 -7
  125. package/src/components/layout/ReferenceLayout.astro +1 -1
  126. package/src/components/layout/RootLayout.astro +6 -6
  127. package/src/components/layout/Search.astro +13 -13
  128. package/src/components/layout/analytics-client.ts +1 -1
  129. package/src/components/layout/drawer-inert.ts +1 -1
  130. package/src/components/openapi/description.ts +2 -2
  131. package/src/core/code-fences.ts +1 -1
  132. package/src/core/config-input.ts +19 -19
  133. package/src/core/config.ts +3 -3
  134. package/src/core/data.ts +3 -3
  135. package/src/core/i18n-ui.ts +35 -9
  136. package/src/core/request-body.ts +1 -1
  137. package/src/core/schema.ts +25 -20
  138. package/src/core/server-features.ts +2 -2
  139. package/src/core/ui-packs/ar.ts +4 -5
  140. package/src/core/ui-packs/bg.ts +4 -5
  141. package/src/core/ui-packs/bn.ts +4 -5
  142. package/src/core/ui-packs/ca.ts +4 -5
  143. package/src/core/ui-packs/cs.ts +4 -5
  144. package/src/core/ui-packs/da.ts +4 -5
  145. package/src/core/ui-packs/de.ts +4 -5
  146. package/src/core/ui-packs/el.ts +4 -5
  147. package/src/core/ui-packs/es.ts +4 -5
  148. package/src/core/ui-packs/fa.ts +4 -5
  149. package/src/core/ui-packs/fi.ts +4 -5
  150. package/src/core/ui-packs/fr.ts +4 -5
  151. package/src/core/ui-packs/he.ts +4 -5
  152. package/src/core/ui-packs/hi.ts +4 -5
  153. package/src/core/ui-packs/hr.ts +4 -5
  154. package/src/core/ui-packs/hu.ts +4 -5
  155. package/src/core/ui-packs/id.ts +4 -5
  156. package/src/core/ui-packs/it.ts +4 -5
  157. package/src/core/ui-packs/ja.ts +4 -5
  158. package/src/core/ui-packs/ko.ts +4 -5
  159. package/src/core/ui-packs/nl.ts +4 -5
  160. package/src/core/ui-packs/no.ts +4 -5
  161. package/src/core/ui-packs/pl.ts +4 -5
  162. package/src/core/ui-packs/pt-br.ts +4 -5
  163. package/src/core/ui-packs/pt.ts +4 -5
  164. package/src/core/ui-packs/ro.ts +4 -5
  165. package/src/core/ui-packs/ru.ts +4 -5
  166. package/src/core/ui-packs/sk.ts +4 -5
  167. package/src/core/ui-packs/sr.ts +4 -5
  168. package/src/core/ui-packs/sv.ts +4 -5
  169. package/src/core/ui-packs/th.ts +4 -5
  170. package/src/core/ui-packs/tr.ts +4 -5
  171. package/src/core/ui-packs/uk.ts +4 -5
  172. package/src/core/ui-packs/vi.ts +4 -5
  173. package/src/core/ui-packs/zh-tw.ts +4 -5
  174. package/src/core/ui-packs/zh.ts +4 -5
  175. package/src/core/unrecognized-keys.ts +1 -1
  176. package/src/registry/eject.ts +19 -18
  177. package/src/search/documents.ts +2 -2
  178. package/src/search/orama-index.ts +1 -1
  179. package/src/translate/report.ts +1 -1
  180. package/src/upgrade/upgrade.ts +1 -1
  181. package/dist/cli/chunk-mnqj32sj.js.map +0 -12
  182. package/dist/cli/chunk-mwt1k8n7.js.map +0 -10
  183. /package/dist/cli/{chunk-f7t03s3g.js.map → chunk-27g6wdth.js.map} +0 -0
  184. /package/dist/cli/{chunk-by2290sx.js.map → chunk-5shv93fd.js.map} +0 -0
  185. /package/dist/cli/{chunk-nk3ts2xk.js.map → chunk-82bbrxdn.js.map} +0 -0
  186. /package/dist/cli/{chunk-zxccj738.js.map → chunk-ce574jw2.js.map} +0 -0
  187. /package/dist/cli/{chunk-y3e45rc8.js.map → chunk-ch6g3ar0.js.map} +0 -0
  188. /package/dist/cli/{chunk-1w8dp3qb.js.map → chunk-epjnccmv.js.map} +0 -0
  189. /package/dist/cli/{chunk-ernrthtr.js.map → chunk-f2z5v128.js.map} +0 -0
  190. /package/dist/cli/{chunk-zg2gtj10.js.map → chunk-fs23ddbb.js.map} +0 -0
  191. /package/dist/cli/{chunk-7ez8ny0t.js.map → chunk-fxypxtvm.js.map} +0 -0
  192. /package/dist/cli/{chunk-tzne8qfq.js.map → chunk-fz5wtpmh.js.map} +0 -0
  193. /package/dist/cli/{chunk-b5aj94ah.js.map → chunk-hdpx1tax.js.map} +0 -0
  194. /package/dist/cli/{chunk-fh5hj5jt.js.map → chunk-kdp5q7ke.js.map} +0 -0
  195. /package/dist/cli/{chunk-bctazmbk.js.map → chunk-mb2919y2.js.map} +0 -0
  196. /package/dist/cli/{chunk-79njf86q.js.map → chunk-q5163e60.js.map} +0 -0
  197. /package/dist/cli/{chunk-sqn5t4q0.js.map → chunk-qs4q5p4e.js.map} +0 -0
  198. /package/dist/cli/{chunk-bw22s759.js.map → chunk-qwsrynx5.js.map} +0 -0
  199. /package/dist/cli/{chunk-z01ze5c1.js.map → chunk-s1p84fyh.js.map} +0 -0
  200. /package/dist/cli/{chunk-f2972sbt.js.map → chunk-vtk4a6dg.js.map} +0 -0
  201. /package/dist/cli/{chunk-d1tadaw7.js.map → chunk-yt5n7ppj.js.map} +0 -0
  202. /package/dist/cli/{chunk-88cpgt6h.js.map → chunk-zxcczpyx.js.map} +0 -0
  203. /package/dist/cli/{chunk-41za066z.js.map → chunk-zxh4d9vy.js.map} +0 -0
@@ -2,7 +2,7 @@ import type { AstroIntegration } from "astro";
2
2
  import type { z } from "zod";
3
3
 
4
4
  import type { AskRetrievalOptions } from "../ai/ask-context.ts";
5
- import type { AskAdapter } from "../ai/ask.ts";
5
+ import type { AssistantAdapter } from "../ai/ask.ts";
6
6
  import type { ComponentMarkdown } from "../ai/component-markdown.ts";
7
7
  import type { AnalyticsAdapter } from "../analytics/schema.ts";
8
8
  import type { DeploymentInput } from "../deploy/adapters/registry.ts";
@@ -488,16 +488,16 @@ export type SearchConfig = SearchProviderConfig | SearchOptions;
488
488
  // AI
489
489
  // ---------------------------------------------------------------------------
490
490
 
491
- /** An empty-state prompt shown before the first Ask AI question. */
492
- export interface AskSuggestion {
491
+ /** An empty-state prompt shown before the first question to the assistant. */
492
+ export interface AssistantSuggestion {
493
493
  /** Lucide icon name shown beside the suggestion. */
494
494
  icon?: string;
495
495
  /** The clickable suggestion text. */
496
496
  label: string;
497
497
  }
498
498
 
499
- /** How much retrieved documentation each Ask AI question carries. */
500
- export interface AskRetrievalConfig {
499
+ /** How much retrieved documentation each question to the assistant carries. */
500
+ export interface AssistantRetrievalConfig {
501
501
  /**
502
502
  * Total injected documentation characters, across all excerpts. Defaults to
503
503
  * `10000`. The single biggest lever on time-to-first-token — the model reads
@@ -518,8 +518,8 @@ export interface AskRetrievalConfig {
518
518
  maxResults?: number;
519
519
  }
520
520
 
521
- /** The Ask AI chat assistant. */
522
- export interface AskConfig {
521
+ /** The chat assistant. */
522
+ export interface AssistantConfig {
523
523
  /**
524
524
  * Origins allowed to call the generated endpoint from another site — a
525
525
  * marketing page that embeds an ask box, for example — or `"*"` to allow
@@ -532,10 +532,10 @@ export interface AskConfig {
532
532
  * combined with it.
533
533
  */
534
534
  cors?: string[];
535
- /** Turn Ask AI on. Defaults to `false`. */
535
+ /** Turn the assistant on. Defaults to `false`. */
536
536
  enabled?: boolean;
537
537
  /**
538
- * Existing Ask AI endpoint to call instead of generating one. This keeps a
538
+ * Existing assistant endpoint to call instead of generating one. This keeps a
539
539
  * Blume site static while an API backend owns retrieval, model access, rate
540
540
  * limiting, and streaming. Accepts an absolute URL or root-relative path.
541
541
  */
@@ -555,15 +555,15 @@ export interface AskConfig {
555
555
  * mapping, and `providerOptions` passthrough. Defaults to
556
556
  * `gateway({ model: "openai/gpt-5.5" })`.
557
557
  */
558
- provider?: AskAdapter;
558
+ provider?: AssistantAdapter;
559
559
  /**
560
560
  * How much documentation each question carries into the model's prompt.
561
561
  * Lower values cut time-to-first-token — which dominates on a self-hosted
562
562
  * backend — at the cost of recall. Defaults keep the built-in behavior.
563
563
  */
564
- retrieval?: AskRetrievalConfig;
564
+ retrieval?: AssistantRetrievalConfig;
565
565
  /** Starter prompts shown before the first question. */
566
- suggestions?: AskSuggestion[];
566
+ suggestions?: AssistantSuggestion[];
567
567
  }
568
568
 
569
569
  /** What the AI Catalog (ARD) manifest carries. */
@@ -631,10 +631,10 @@ export interface McpConfig {
631
631
  route?: string;
632
632
  }
633
633
 
634
- /** Model-facing features: the Ask AI assistant and the "Open in chat" action. */
634
+ /** Model-facing features: the assistant and the "Open in chat" action. */
635
635
  export interface AiConfig {
636
- /** The Ask AI chat assistant. */
637
- ask?: AskConfig;
636
+ /** The chat assistant. */
637
+ assistant?: AssistantConfig;
638
638
  /**
639
639
  * The "Open in chat" page action, which opens the current page in an AI
640
640
  * assistant pre-filled with a prompt pointing at its raw Markdown.
@@ -833,7 +833,7 @@ export type ContentSignalsConfig =
833
833
  /**
834
834
  * The machine-readable surface agents consume: the JSON API, `llms.txt`, the
835
835
  * MCP server, published skills, discovery manifests, and the robots.txt usage
836
- * policy. The reader-facing model features (Ask AI, Open in chat) live under
836
+ * policy. The reader-facing model features (the assistant, Open in chat) live under
837
837
  * `ai`.
838
838
  */
839
839
  export interface AgentsConfig {
@@ -1331,7 +1331,7 @@ export type TocConfig =
1331
1331
  export interface BlumeConfig {
1332
1332
  /** The machine-readable surface for agents: JSON API, `llms.txt`, MCP, skills, discovery. */
1333
1333
  agents?: AgentsConfig;
1334
- /** Model-facing features: the Ask AI assistant and the "Open in chat" action. */
1334
+ /** Model-facing features: the assistant and the "Open in chat" action. */
1335
1335
  ai?: AiConfig;
1336
1336
  /**
1337
1337
  * Analytics adapters from `blume/analytics`, emitted into `<head>` of every
@@ -1452,10 +1452,10 @@ type _NoExtraOrMissingKeys = AssertExtends<
1452
1452
  // endpoint and silently ignored at request time). `Required` makes a rename in
1453
1453
  // either copy a missing property, which stops compiling.
1454
1454
  type _AskRetrievalMatchesRuntime = AssertExtends<
1455
- Required<AskRetrievalConfig>,
1455
+ Required<AssistantRetrievalConfig>,
1456
1456
  Required<AskRetrievalOptions>
1457
1457
  >;
1458
1458
  type _AskRuntimeMatchesRetrieval = AssertExtends<
1459
1459
  Required<AskRetrievalOptions>,
1460
- Required<AskRetrievalConfig>
1460
+ Required<AssistantRetrievalConfig>
1461
1461
  >;
@@ -87,7 +87,7 @@ import type { Diagnostic } from "./types.ts";
87
87
  * `flexsearch()`, `pagefind()`, `algolia({…})`, `oramaCloud({…})`,
88
88
  * `typesense({…})`, `mixedbread({…})`, or `false`), or `{ provider,
89
89
  * popular, indexing }` to add curated links and indexing settings.
90
- * - `ai` — what faces a model at read time: `ask` (the Ask AI assistant, with
90
+ * - `ai` — what faces a model at read time: `assistant` (the chat assistant, with
91
91
  * a provider adapter from `blume/ai` such as `gateway()` or `openrouter()`)
92
92
  * and `openInChat` (the "Open in chat" page action).
93
93
  * - `agents` — the machine-readable surface: `llmsTxt`, the JSON `api`, the
@@ -146,7 +146,7 @@ import type { Diagnostic } from "./types.ts";
146
146
  * });
147
147
  * ```
148
148
  *
149
- * @example An OpenAPI reference with the Ask AI assistant enabled.
149
+ * @example An OpenAPI reference with the assistant enabled.
150
150
  * ```ts
151
151
  * import { openapi } from "blume/reference";
152
152
  *
@@ -159,7 +159,7 @@ import type { Diagnostic } from "./types.ts";
159
159
  * }),
160
160
  * ],
161
161
  * agents: { llmsTxt: true },
162
- * ai: { ask: { enabled: true } },
162
+ * ai: { assistant: { enabled: true } },
163
163
  * });
164
164
  * ```
165
165
  *
package/src/core/data.ts CHANGED
@@ -122,10 +122,10 @@ export interface BlumeDataConfig {
122
122
  analytics: ResolvedConfig["analytics"];
123
123
  /** Apple touch icon, or `null` when none is configured/detected. */
124
124
  appleIcon: BlumeFavicon | null;
125
- /** Ask AI empty-state suggestions, or `null` when Ask AI is off. */
126
- ask: {
125
+ /** The assistant's empty-state suggestions, or `null` when the assistant is off. */
126
+ assistant: {
127
127
  endpoint: string | null;
128
- suggestions: NonNullable<ResolvedConfig["ai"]["ask"]>["suggestions"];
128
+ suggestions: NonNullable<ResolvedConfig["ai"]["assistant"]>["suggestions"];
129
129
  } | null;
130
130
  banner: BlumeBanner | null;
131
131
  /** Site-wide route mount point, normalized to `""` or `/seg` (see config). */
@@ -15,7 +15,6 @@ const uiStringsObject = z.object({
15
15
  .object({
16
16
  addToCursor: z.string().default("Add to Cursor"),
17
17
  addToVscode: z.string().default("Add to VS Code"),
18
- askAI: z.string().default("Ask AI about this page"),
19
18
  connectMcp: z.string().default("Connect to MCP"),
20
19
  copied: z.string().default("Copied!"),
21
20
  copyClaudeCode: z.string().default("Copy Claude Code command"),
@@ -40,7 +39,7 @@ const uiStringsObject = z.object({
40
39
  scrollToTop: z.string().default("Scroll to top"),
41
40
  })
42
41
  .prefault({}),
43
- ask: z
42
+ assistant: z
44
43
  .object({
45
44
  ai: z.string().default("AI"),
46
45
  clear: z.string().default("Clear conversation"),
@@ -52,7 +51,7 @@ const uiStringsObject = z.object({
52
51
  placeholder: z.string().default("Ask a question…"),
53
52
  send: z.string().default("Send"),
54
53
  tip: z.string().default("Tip: You can open and close chat with"),
55
- title: z.string().default("Ask AI"),
54
+ title: z.string().default("Assistant"),
56
55
  you: z.string().default("You"),
57
56
  })
58
57
  .prefault({}),
@@ -142,8 +141,8 @@ const uiStringsObject = z.object({
142
141
  all: z.string().default("All"),
143
142
  allLanguages: z.string().default("All languages"),
144
143
  allVersions: z.string().default("All versions"),
145
- askAi: z.string().default("Ask AI"),
146
- askAiHint: z.string().default("Get an instant answer from AI"),
144
+ assistant: z.string().default("Assistant"),
145
+ assistantHint: z.string().default("Get an instant answer from AI"),
147
146
  button: z.string().default("Search"),
148
147
  devOnly: z
149
148
  .string()
@@ -204,11 +203,38 @@ export const uiStringsOverrideSchema = z.record(
204
203
 
205
204
  export type UIStringsOverride = z.infer<typeof uiStringsOverrideSchema>;
206
205
 
206
+ /**
207
+ * UI string keys renamed when Ask AI became the assistant, as `group` or
208
+ * `group.key`, each with its new name. Unknown keys merge harmlessly, so an
209
+ * override under an old name would otherwise be dropped without a word.
210
+ */
211
+ const RENAMED_UI_KEYS = new Map([
212
+ ["ask", "assistant"],
213
+ ["search.askAi", "search.assistant"],
214
+ ["search.askAiHint", "search.assistantHint"],
215
+ ]);
216
+
207
217
  /** Per-locale UI overrides supplied in `i18n.ui`. */
208
- export const uiLocaleOverridesSchema = z.record(
209
- z.string(),
210
- uiStringsOverrideSchema
211
- );
218
+ export const uiLocaleOverridesSchema = z
219
+ .record(z.string(), uiStringsOverrideSchema)
220
+ .superRefine((value, ctx) => {
221
+ for (const [locale, override] of Object.entries(value)) {
222
+ const keys = Object.entries(override).flatMap(([group, strings]) => [
223
+ group,
224
+ ...Object.keys(strings).map((key) => `${group}.${key}`),
225
+ ]);
226
+ for (const key of keys) {
227
+ const renamed = RENAMED_UI_KEYS.get(key);
228
+ if (renamed) {
229
+ ctx.addIssue({
230
+ code: z.ZodIssueCode.custom,
231
+ message: `i18n.ui.${locale}.${key} was renamed to i18n.ui.${locale}.${renamed}.`,
232
+ path: [locale, ...key.split(".")],
233
+ });
234
+ }
235
+ }
236
+ }
237
+ });
212
238
 
213
239
  /** Merge an override's string leaves onto a base dictionary (two levels deep). */
214
240
  const mergeUI = (base: UIStrings, override?: UIStringsOverride): UIStrings => {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Read a request body under a size cap, for the unauthenticated endpoints a
3
- * server build exposes (the Ask AI route, the API playground proxy). A
3
+ * server build exposes (the assistant route, the API playground proxy). A
4
4
  * self-hosted Node server buffers whatever a client sends, so an endpoint that
5
5
  * starts with `request.json()` or `arrayBuffer()` lets one oversized POST
6
6
  * allocate hundreds of megabytes before any validation runs. A declared
@@ -2,9 +2,9 @@ import type { AstroIntegration } from "astro";
2
2
  import { z } from "zod";
3
3
 
4
4
  import {
5
- askAdapterSchema,
6
- askMovedFieldsHint,
7
- DEFAULT_ASK_PROVIDER,
5
+ assistantAdapterSchema,
6
+ assistantMovedFieldsHint,
7
+ DEFAULT_ASSISTANT_PROVIDER,
8
8
  } from "../ai/ask.ts";
9
9
  import type { ComponentMarkdown } from "../ai/component-markdown.ts";
10
10
  import { analyticsConfigSchema } from "../analytics/schema.ts";
@@ -744,7 +744,7 @@ const mcpConfigSchema = z.strictObject({
744
744
  route: z.string().default("/mcp").transform(normalizeRoute),
745
745
  });
746
746
 
747
- const askEndpointSchema = z
747
+ const assistantEndpointSchema = z
748
748
  .string()
749
749
  .trim()
750
750
  .min(1)
@@ -762,7 +762,7 @@ const askEndpointSchema = z
762
762
  },
763
763
  {
764
764
  message:
765
- "ai.ask.endpoint must be an HTTP(S) URL or a root-relative path.",
765
+ "ai.assistant.endpoint must be an HTTP(S) URL or a root-relative path.",
766
766
  }
767
767
  );
768
768
 
@@ -799,7 +799,7 @@ type AiCatalogResolved = z.output<typeof aiCatalogObjectSchema>;
799
799
 
800
800
  /**
801
801
  * The keys that moved from `ai` to `agents`: `ai` now holds only what faces a
802
- * model at read time (Ask AI, Open in chat), and the machine-readable surface
802
+ * model at read time (the assistant, Open in chat), and the machine-readable surface
803
803
  * agents consume lives under `agents`.
804
804
  */
805
805
  const MOVED_TO_AGENTS = [
@@ -821,9 +821,9 @@ const movedToAgentsHints = (from: string): Record<string, string> =>
821
821
  ])
822
822
  );
823
823
 
824
- /** Model-facing config: the Ask AI assistant and the "Open in chat" action. */
824
+ /** Model-facing config: the assistant and the "Open in chat" action. */
825
825
  const aiConfigFields = {
826
- ask: z
826
+ assistant: z
827
827
  .strictObject(
828
828
  {
829
829
  // Origins allowed to call the generated `/api/ask` from another site (a
@@ -843,9 +843,9 @@ const aiConfigFields = {
843
843
  .optional(),
844
844
  enabled: z.boolean().default(false),
845
845
  // Optional external endpoint for projects that keep their docs static
846
- // and host Ask AI in an existing backend. Absolute URLs and root-relative
846
+ // and host the assistant in an existing backend. Absolute URLs and root-relative
847
847
  // paths are both valid; the built-in request/stream contract is unchanged.
848
- endpoint: askEndpointSchema.optional(),
848
+ endpoint: assistantEndpointSchema.optional(),
849
849
  // Extra system-prompt text (identity, language, tone) appended to the
850
850
  // built-in instructions, so the grounding contract — answer from the
851
851
  // retrieved excerpts, cite pages as Markdown links — stays intact.
@@ -853,9 +853,9 @@ const aiConfigFields = {
853
853
  // The adapter descriptor a `gateway()`/`openrouter()`/... factory
854
854
  // returns; each adapter validates its own options (model, key env var,
855
855
  // reasoning mapping, `providerOptions` passthrough) in `ai/ask.ts`.
856
- // Unset means the gateway with its default model, so zero-config Ask AI
856
+ // Unset means the gateway with its default model, so the zero-config assistant
857
857
  // is unchanged.
858
- provider: askAdapterSchema.prefault(DEFAULT_ASK_PROVIDER),
858
+ provider: assistantAdapterSchema.prefault(DEFAULT_ASSISTANT_PROVIDER),
859
859
  // How much documentation each question carries. Injected characters are
860
860
  // the dominant term in time-to-first-token on a self-hosted backend, so
861
861
  // these trade recall for latency. No zod defaults here: only what the
@@ -880,7 +880,7 @@ const aiConfigFields = {
880
880
  )
881
881
  .default([]),
882
882
  },
883
- askMovedFieldsHint
883
+ assistantMovedFieldsHint
884
884
  )
885
885
  .superRefine((value, ctx) => {
886
886
  // `cors` configures the generated route, which an external `endpoint`
@@ -889,7 +889,7 @@ const aiConfigFields = {
889
889
  ctx.addIssue({
890
890
  code: z.ZodIssueCode.custom,
891
891
  message:
892
- "ai.ask.cors only applies to the generated route; with ai.ask.endpoint, CORS is that backend's job.",
892
+ "ai.assistant.cors only applies to the generated route; with ai.assistant.endpoint, CORS is that backend's job.",
893
893
  path: ["cors"],
894
894
  });
895
895
  }
@@ -921,7 +921,10 @@ const aiConfigFields = {
921
921
 
922
922
  const aiConfigSchema = z.strictObject(
923
923
  aiConfigFields,
924
- removedKeysHint(movedToAgentsHints("ai"))
924
+ removedKeysHint({
925
+ ...movedToAgentsHints("ai"),
926
+ ask: "ai.ask was renamed to ai.assistant.",
927
+ })
925
928
  );
926
929
 
927
930
  /**
@@ -988,9 +991,11 @@ const navigationConfigSchema = z.strictObject({
988
991
  tabs: z.array(navTabSchema).default([]),
989
992
  });
990
993
 
991
- export { askReasoningLevels } from "../ai/ask.ts";
992
- export type { AskReasoning } from "../ai/ask.ts";
993
- export type AskAiConfig = NonNullable<z.infer<typeof aiConfigSchema>["ask"]>;
994
+ export { assistantReasoningLevels } from "../ai/ask.ts";
995
+ export type { AssistantReasoning } from "../ai/ask.ts";
996
+ export type AssistantConfig = NonNullable<
997
+ z.infer<typeof aiConfigSchema>["assistant"]
998
+ >;
994
999
  export { openInChatProviders } from "./open-in-chat.ts";
995
1000
  export type { OpenInChatProvider } from "./open-in-chat.ts";
996
1001
 
@@ -1415,7 +1420,7 @@ const seoConfigSchema = z.strictObject(
1415
1420
  /**
1416
1421
  * The machine-readable surface agents consume: the JSON API, `llms.txt`, the
1417
1422
  * MCP server, published skills, discovery manifests, and the robots.txt
1418
- * usage policy. Everything reader-facing that talks to a model (Ask AI, Open
1423
+ * usage policy. Everything reader-facing that talks to a model (the assistant, Open
1419
1424
  * in chat) stays under `ai`.
1420
1425
  */
1421
1426
  const agentsConfigSchema = z.strictObject({
@@ -1731,7 +1736,7 @@ const reactConfigSchema = z.strictObject({
1731
1736
  /**
1732
1737
  * Auto-memoize React components/hooks with the React Compiler
1733
1738
  * (`babel-plugin-react-compiler`). On by default whenever React is enabled
1734
- * (a project `.tsx`/`.jsx`, a React island/example/override, or Ask AI); set
1739
+ * (a project `.tsx`/`.jsx`, a React island/example/override, or the assistant); set
1735
1740
  * to `false` to skip the compiler's babel pass.
1736
1741
  */
1737
1742
  compiler: z.boolean().default(true),
@@ -7,8 +7,8 @@ import type { ResolvedConfig } from "./schema.ts";
7
7
  */
8
8
  export const serverFeatures = (config: ResolvedConfig): string[] => {
9
9
  const features: string[] = [];
10
- if (config.ai.ask?.enabled && !config.ai.ask.endpoint) {
11
- features.push("Ask AI");
10
+ if (config.ai.assistant?.enabled && !config.ai.assistant.endpoint) {
11
+ features.push("Assistant");
12
12
  }
13
13
  // The hosted MCP server is a live JSON-RPC endpoint, so it needs a runtime.
14
14
  if (config.agents.mcp.enabled) {
@@ -5,7 +5,6 @@ export const ar: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "إضافة إلى Cursor",
7
7
  addToVscode: "إضافة إلى VS Code",
8
- askAI: "اسأل الذكاء الاصطناعي عن هذه الصفحة",
9
8
  connectMcp: "الاتصال بـ MCP",
10
9
  copied: "تم النسخ!",
11
10
  copyClaudeCode: "نسخ أمر Claude Code",
@@ -24,7 +23,7 @@ export const ar: UIStringsOverride = {
24
23
  openInChatPrompt: "اقرأ {url} حتى أتمكن من طرح أسئلة حول هذه الصفحة.",
25
24
  scrollToTop: "العودة إلى الأعلى",
26
25
  },
27
- ask: {
26
+ assistant: {
28
27
  ai: "الذكاء الاصطناعي",
29
28
  clear: "مسح المحادثة",
30
29
  close: "إغلاق",
@@ -35,7 +34,7 @@ export const ar: UIStringsOverride = {
35
34
  placeholder: "اطرح سؤالاً…",
36
35
  send: "إرسال",
37
36
  tip: "نصيحة: يمكنك فتح المحادثة وإغلاقها باستخدام",
38
- title: "اسأل الذكاء الاصطناعي",
37
+ title: "المساعد",
39
38
  you: "أنت",
40
39
  },
41
40
  banner: { dismiss: "إغلاق الإعلان" },
@@ -84,8 +83,8 @@ export const ar: UIStringsOverride = {
84
83
  search: {
85
84
  all: "الكل",
86
85
  allLanguages: "جميع اللغات",
87
- askAi: "اسأل الذكاء الاصطناعي",
88
- askAiHint: "احصل على إجابة فورية من الذكاء الاصطناعي",
86
+ assistant: "المساعد",
87
+ assistantHint: "احصل على إجابة فورية من الذكاء الاصطناعي",
89
88
  button: "بحث",
90
89
  devOnly: "البحث متاح في إصدار الإنتاج.",
91
90
  error: "حدث خطأ ما. يرجى المحاولة مرة أخرى.",
@@ -5,7 +5,6 @@ export const bg: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Добави в Cursor",
7
7
  addToVscode: "Добави във VS Code",
8
- askAI: "Попитай ИИ за тази страница",
9
8
  connectMcp: "Свържи се с MCP",
10
9
  copied: "Копирано!",
11
10
  copyClaudeCode: "Копирай командата на Claude Code",
@@ -25,7 +24,7 @@ export const bg: UIStringsOverride = {
25
24
  "Прочетете {url}, за да мога да задавам въпроси за тази страница.",
26
25
  scrollToTop: "Нагоре",
27
26
  },
28
- ask: {
27
+ assistant: {
29
28
  ai: "ИИ",
30
29
  clear: "Изчисти разговора",
31
30
  close: "Затвори",
@@ -36,7 +35,7 @@ export const bg: UIStringsOverride = {
36
35
  placeholder: "Задайте въпрос…",
37
36
  send: "Изпрати",
38
37
  tip: "Съвет: Можете да отваряте и затваряте чата с",
39
- title: "Попитай ИИ",
38
+ title: "Асистент",
40
39
  you: "Вие",
41
40
  },
42
41
  banner: { dismiss: "Затваряне на съобщението" },
@@ -85,8 +84,8 @@ export const bg: UIStringsOverride = {
85
84
  search: {
86
85
  all: "Всички",
87
86
  allLanguages: "Всички езици",
88
- askAi: "Попитай ИИ",
89
- askAiHint: "Получете незабавен отговор от ИИ",
87
+ assistant: "Асистент",
88
+ assistantHint: "Получете незабавен отговор от ИИ",
90
89
  button: "Търсене",
91
90
  devOnly: "Търсенето е достъпно в производствената компилация.",
92
91
  error: "Нещо се обърка. Моля, опитайте отново.",
@@ -5,7 +5,6 @@ export const bn: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Cursor-এ যোগ করুন",
7
7
  addToVscode: "VS Code-এ যোগ করুন",
8
- askAI: "এই পৃষ্ঠা সম্পর্কে AI-কে জিজ্ঞাসা করুন",
9
8
  connectMcp: "MCP-তে সংযোগ করুন",
10
9
  copied: "অনুলিপি করা হয়েছে!",
11
10
  copyClaudeCode: "Claude Code কমান্ড অনুলিপি করুন",
@@ -24,7 +23,7 @@ export const bn: UIStringsOverride = {
24
23
  openInChatPrompt: "{url} পড়ুন, যাতে আমি এই পৃষ্ঠা সম্পর্কে প্রশ্ন করতে পারি।",
25
24
  scrollToTop: "উপরে যান",
26
25
  },
27
- ask: {
26
+ assistant: {
28
27
  ai: "AI",
29
28
  clear: "কথোপকথন মুছুন",
30
29
  close: "বন্ধ করুন",
@@ -35,7 +34,7 @@ export const bn: UIStringsOverride = {
35
34
  placeholder: "একটি প্রশ্ন করুন…",
36
35
  send: "পাঠান",
37
36
  tip: "টিপ: চ্যাট খুলতে ও বন্ধ করতে চাপুন",
38
- title: "AI-কে জিজ্ঞাসা করুন",
37
+ title: "সহকারী",
39
38
  you: "আপনি",
40
39
  },
41
40
  banner: { dismiss: "ঘোষণা বন্ধ করুন" },
@@ -84,8 +83,8 @@ export const bn: UIStringsOverride = {
84
83
  search: {
85
84
  all: "সব",
86
85
  allLanguages: "সব ভাষা",
87
- askAi: "AI-কে জিজ্ঞাসা করুন",
88
- askAiHint: "AI থেকে তাৎক্ষণিক উত্তর পান",
86
+ assistant: "সহকারী",
87
+ assistantHint: "AI থেকে তাৎক্ষণিক উত্তর পান",
89
88
  button: "অনুসন্ধান",
90
89
  devOnly: "অনুসন্ধান প্রোডাকশন বিল্ডে উপলব্ধ।",
91
90
  error: "কিছু একটা ভুল হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।",
@@ -5,7 +5,6 @@ export const ca: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Afegeix a Cursor",
7
7
  addToVscode: "Afegeix a VS Code",
8
- askAI: "Pregunta a la IA sobre aquesta pàgina",
9
8
  connectMcp: "Connecta a MCP",
10
9
  copied: "Copiat!",
11
10
  copyClaudeCode: "Copia l'ordre de Claude Code",
@@ -25,7 +24,7 @@ export const ca: UIStringsOverride = {
25
24
  "Llegeix {url} perquè pugui fer-te preguntes sobre aquesta pàgina.",
26
25
  scrollToTop: "Torna a dalt",
27
26
  },
28
- ask: {
27
+ assistant: {
29
28
  ai: "IA",
30
29
  clear: "Esborra la conversa",
31
30
  close: "Tanca",
@@ -36,7 +35,7 @@ export const ca: UIStringsOverride = {
36
35
  placeholder: "Fes una pregunta…",
37
36
  send: "Envia",
38
37
  tip: "Consell: pots obrir i tancar el xat amb",
39
- title: "Pregunta a la IA",
38
+ title: "Assistent",
40
39
  you: "Tu",
41
40
  },
42
41
  banner: { dismiss: "Tanca l'anunci" },
@@ -85,8 +84,8 @@ export const ca: UIStringsOverride = {
85
84
  search: {
86
85
  all: "Tots",
87
86
  allLanguages: "Tots els idiomes",
88
- askAi: "Pregunta a la IA",
89
- askAiHint: "Obtén una resposta instantània de la IA",
87
+ assistant: "Assistent",
88
+ assistantHint: "Obtén una resposta instantània de la IA",
90
89
  button: "Cerca",
91
90
  devOnly: "La cerca està disponible a la compilació de producció.",
92
91
  error: "Alguna cosa ha anat malament. Torna-ho a provar.",
@@ -5,7 +5,6 @@ export const cs: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Přidat do Cursoru",
7
7
  addToVscode: "Přidat do VS Code",
8
- askAI: "Zeptat se AI na tuto stránku",
9
8
  connectMcp: "Připojit k MCP",
10
9
  copied: "Zkopírováno!",
11
10
  copyClaudeCode: "Kopírovat příkaz Claude Code",
@@ -24,7 +23,7 @@ export const cs: UIStringsOverride = {
24
23
  openInChatPrompt: "Přečtěte si {url}, ať se mohu ptát na tuto stránku.",
25
24
  scrollToTop: "Zpět nahoru",
26
25
  },
27
- ask: {
26
+ assistant: {
28
27
  ai: "AI",
29
28
  clear: "Vymazat konverzaci",
30
29
  close: "Zavřít",
@@ -35,7 +34,7 @@ export const cs: UIStringsOverride = {
35
34
  placeholder: "Položit otázku…",
36
35
  send: "Odeslat",
37
36
  tip: "Tip: Chat můžete otevřít a zavřít pomocí",
38
- title: "Zeptat se AI",
37
+ title: "Asistent",
39
38
  you: "Vy",
40
39
  },
41
40
  banner: { dismiss: "Zavřít oznámení" },
@@ -84,8 +83,8 @@ export const cs: UIStringsOverride = {
84
83
  search: {
85
84
  all: "Vše",
86
85
  allLanguages: "Všechny jazyky",
87
- askAi: "Zeptat se AI",
88
- askAiHint: "Získejte okamžitou odpověď od AI",
86
+ assistant: "Asistent",
87
+ assistantHint: "Získejte okamžitou odpověď od AI",
89
88
  button: "Hledat",
90
89
  devOnly: "Vyhledávání je dostupné v produkčním buildu.",
91
90
  error: "Něco se pokazilo. Zkuste to prosím znovu.",
@@ -5,7 +5,6 @@ export const da: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Føj til Cursor",
7
7
  addToVscode: "Føj til VS Code",
8
- askAI: "Spørg AI om denne side",
9
8
  connectMcp: "Opret forbindelse til MCP",
10
9
  copied: "Kopieret!",
11
10
  copyClaudeCode: "Kopiér Claude Code-kommando",
@@ -24,7 +23,7 @@ export const da: UIStringsOverride = {
24
23
  openInChatPrompt: "Læs {url}, så jeg kan stille spørgsmål om denne side.",
25
24
  scrollToTop: "Tilbage til toppen",
26
25
  },
27
- ask: {
26
+ assistant: {
28
27
  ai: "AI",
29
28
  clear: "Ryd samtalen",
30
29
  close: "Luk",
@@ -35,7 +34,7 @@ export const da: UIStringsOverride = {
35
34
  placeholder: "Stil et spørgsmål…",
36
35
  send: "Send",
37
36
  tip: "Tip: Du kan åbne og lukke chatten med",
38
- title: "Spørg AI",
37
+ title: "Assistent",
39
38
  you: "Du",
40
39
  },
41
40
  banner: { dismiss: "Luk meddelelsen" },
@@ -84,8 +83,8 @@ export const da: UIStringsOverride = {
84
83
  search: {
85
84
  all: "Alle",
86
85
  allLanguages: "Alle sprog",
87
- askAi: "Spørg AI",
88
- askAiHint: "Få et øjeblikkeligt svar fra AI",
86
+ assistant: "Assistent",
87
+ assistantHint: "Få et øjeblikkeligt svar fra AI",
89
88
  button: "Søg",
90
89
  devOnly: "Søgning er tilgængelig i produktionsbygningen.",
91
90
  error: "Noget gik galt. Prøv igen.",
@@ -5,7 +5,6 @@ export const de: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Zu Cursor hinzufügen",
7
7
  addToVscode: "Zu VS Code hinzufügen",
8
- askAI: "KI zu dieser Seite fragen",
9
8
  connectMcp: "Mit MCP verbinden",
10
9
  copied: "Kopiert!",
11
10
  copyClaudeCode: "Claude-Code-Befehl kopieren",
@@ -25,7 +24,7 @@ export const de: UIStringsOverride = {
25
24
  "Lies {url}, damit ich dir Fragen zu dieser Seite stellen kann.",
26
25
  scrollToTop: "Nach oben scrollen",
27
26
  },
28
- ask: {
27
+ assistant: {
29
28
  ai: "KI",
30
29
  clear: "Unterhaltung löschen",
31
30
  close: "Schließen",
@@ -36,7 +35,7 @@ export const de: UIStringsOverride = {
36
35
  placeholder: "Eine Frage stellen…",
37
36
  send: "Senden",
38
37
  tip: "Tipp: Du kannst den Chat öffnen und schließen mit",
39
- title: "KI fragen",
38
+ title: "Assistent",
40
39
  you: "Du",
41
40
  },
42
41
  banner: { dismiss: "Ankündigung schließen" },
@@ -85,8 +84,8 @@ export const de: UIStringsOverride = {
85
84
  search: {
86
85
  all: "Alle",
87
86
  allLanguages: "Alle Sprachen",
88
- askAi: "KI fragen",
89
- askAiHint: "Erhalte sofort eine Antwort von der KI",
87
+ assistant: "Assistent",
88
+ assistantHint: "Erhalte sofort eine Antwort von der KI",
90
89
  button: "Suchen",
91
90
  devOnly: "Die Suche ist im Produktions-Build verfügbar.",
92
91
  error: "Etwas ist schiefgelaufen. Bitte versuche es erneut.",