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.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +28 -0
- package/README.md +2 -2
- package/dist/cli/{chunk-f7t03s3g.js → chunk-27g6wdth.js} +2 -2
- package/dist/cli/{chunk-mnqj32sj.js → chunk-2hn4b8z7.js} +13 -13
- package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
- package/dist/cli/{chunk-by2290sx.js → chunk-5shv93fd.js} +2 -2
- package/dist/cli/{chunk-a9kptbw5.js → chunk-6crbhc3x.js} +3 -3
- package/dist/cli/{chunk-a9kptbw5.js.map → chunk-6crbhc3x.js.map} +1 -1
- package/dist/cli/{chunk-mwt1k8n7.js → chunk-6hsn950k.js} +20 -20
- package/dist/cli/chunk-6hsn950k.js.map +10 -0
- package/dist/cli/{chunk-11j0384y.js → chunk-6vm74dry.js} +13 -13
- package/dist/cli/{chunk-11j0384y.js.map → chunk-6vm74dry.js.map} +3 -3
- package/dist/cli/{chunk-j8mw0za6.js → chunk-79jhk4py.js} +8 -8
- package/dist/cli/{chunk-j8mw0za6.js.map → chunk-79jhk4py.js.map} +2 -2
- package/dist/cli/{chunk-nk3ts2xk.js → chunk-82bbrxdn.js} +2 -2
- package/dist/cli/{chunk-2q1dwty4.js → chunk-ah61y8py.js} +8 -8
- package/dist/cli/{chunk-2q1dwty4.js.map → chunk-ah61y8py.js.map} +4 -4
- package/dist/cli/{chunk-zxccj738.js → chunk-ce574jw2.js} +1 -1
- package/dist/cli/{chunk-y3e45rc8.js → chunk-ch6g3ar0.js} +3 -3
- package/dist/cli/{chunk-beat36xx.js → chunk-dh8cwk36.js} +5 -5
- package/dist/cli/{chunk-beat36xx.js.map → chunk-dh8cwk36.js.map} +2 -2
- package/dist/cli/{chunk-1w8dp3qb.js → chunk-epjnccmv.js} +13 -13
- package/dist/cli/{chunk-ernrthtr.js → chunk-f2z5v128.js} +13 -13
- package/dist/cli/{chunk-zg2gtj10.js → chunk-fs23ddbb.js} +2 -2
- package/dist/cli/{chunk-7ez8ny0t.js → chunk-fxypxtvm.js} +2 -2
- package/dist/cli/{chunk-tzne8qfq.js → chunk-fz5wtpmh.js} +13 -13
- package/dist/cli/{chunk-b5aj94ah.js → chunk-hdpx1tax.js} +4 -4
- package/dist/cli/{chunk-d80hr03s.js → chunk-jwyddg7y.js} +9 -9
- package/dist/cli/{chunk-d80hr03s.js.map → chunk-jwyddg7y.js.map} +2 -2
- package/dist/cli/{chunk-fh5hj5jt.js → chunk-kdp5q7ke.js} +15 -15
- package/dist/cli/{chunk-6k8vp3ta.js → chunk-kpf8rrjc.js} +9 -9
- package/dist/cli/{chunk-6k8vp3ta.js.map → chunk-kpf8rrjc.js.map} +3 -3
- package/dist/cli/{chunk-5a2z0198.js → chunk-m3vmjgmq.js} +9 -9
- package/dist/cli/{chunk-5a2z0198.js.map → chunk-m3vmjgmq.js.map} +2 -2
- package/dist/cli/{chunk-bctazmbk.js → chunk-mb2919y2.js} +4 -4
- package/dist/cli/{chunk-79njf86q.js → chunk-q5163e60.js} +13 -13
- package/dist/cli/{chunk-xaz13gwg.js → chunk-qkqwkpte.js} +196 -208
- package/dist/cli/{chunk-xaz13gwg.js.map → chunk-qkqwkpte.js.map} +48 -48
- package/dist/cli/{chunk-sqn5t4q0.js → chunk-qs4q5p4e.js} +3 -3
- package/dist/cli/{chunk-bw22s759.js → chunk-qwsrynx5.js} +1 -1
- package/dist/cli/{chunk-z01ze5c1.js → chunk-s1p84fyh.js} +15 -15
- package/dist/cli/{chunk-pnnvybbk.js → chunk-s6jhgk0q.js} +5 -5
- package/dist/cli/{chunk-pnnvybbk.js.map → chunk-s6jhgk0q.js.map} +2 -2
- package/dist/cli/{chunk-f2972sbt.js → chunk-vtk4a6dg.js} +1 -1
- package/dist/cli/{chunk-z1f5arsg.js → chunk-wgm7m9qk.js} +21 -21
- package/dist/cli/{chunk-z1f5arsg.js.map → chunk-wgm7m9qk.js.map} +4 -4
- package/dist/cli/{chunk-bnbmcwfb.js → chunk-wm7js3j9.js} +5 -5
- package/dist/cli/{chunk-bnbmcwfb.js.map → chunk-wm7js3j9.js.map} +3 -3
- package/dist/cli/{chunk-d1tadaw7.js → chunk-yt5n7ppj.js} +3 -3
- package/dist/cli/{chunk-pat2zzwc.js → chunk-yw7dm696.js} +1 -1
- package/dist/cli/{chunk-pat2zzwc.js.map → chunk-yw7dm696.js.map} +1 -1
- package/dist/cli/{chunk-88cpgt6h.js → chunk-zxcczpyx.js} +1 -1
- package/dist/cli/{chunk-41za066z.js → chunk-zxh4d9vy.js} +4 -4
- package/dist/cli/index.js +17 -17
- package/dist/types/ai/agent-readability.d.ts +1 -1
- package/dist/types/ai/api/paths.d.ts +1 -1
- package/dist/types/ai/ask-context.d.ts +7 -7
- package/dist/types/ai/ask.d.ts +43 -43
- package/dist/types/ai/index.d.ts +3 -3
- package/dist/types/ai/openapi-components.d.ts +1 -1
- package/dist/types/ai/serializers.d.ts +1 -1
- package/dist/types/ai/visibility.d.ts +1 -1
- package/dist/types/core/config-input.d.ts +17 -17
- package/dist/types/core/config.d.ts +3 -3
- package/dist/types/core/data.d.ts +3 -3
- package/dist/types/core/i18n-ui.d.ts +6 -8
- package/dist/types/core/schema.d.ts +5 -5
- package/dist/types/core/unrecognized-keys.d.ts +1 -1
- package/dist/types/search/documents.d.ts +1 -1
- package/dist/types/search/orama-index.d.ts +1 -1
- package/docs/02-deployment.mdx +4 -4
- package/docs/03-upgrading.mdx +22 -9
- package/docs/04-migrating.mdx +4 -4
- package/docs/08-faq.mdx +3 -3
- package/docs/advanced/custom-pages.mdx +2 -2
- package/docs/advanced/skills.mdx +1 -1
- package/docs/cli/audit.mdx +3 -3
- package/docs/cli/doctor.mdx +3 -3
- package/docs/cli/evals.mdx +7 -7
- package/docs/cli/index.mdx +2 -2
- package/docs/cli/translate.mdx +8 -8
- package/docs/configuration/{ask-ai.mdx → assistant.mdx} +19 -19
- package/docs/configuration/customization.mdx +2 -2
- package/docs/configuration/index.mdx +2 -2
- package/docs/configuration/meta.ts +1 -1
- package/docs/configuration/search.mdx +1 -1
- package/docs/content/i18n.mdx +2 -2
- package/docs/content/islands.mdx +1 -1
- package/docs/discoverability/agent-discovery.mdx +1 -1
- package/docs/discoverability/index.mdx +1 -1
- package/docs/index.mdx +2 -2
- package/package.json +1 -1
- package/skills/blume/SKILL.md +5 -5
- package/skills/blume-migrate/SKILL.md +2 -2
- package/src/ai/agent-readability.ts +4 -4
- package/src/ai/api/paths.ts +1 -1
- package/src/ai/ask-context.ts +7 -7
- package/src/ai/ask-data.ts +2 -2
- package/src/ai/ask.ts +84 -71
- package/src/ai/cors.ts +3 -3
- package/src/ai/index.ts +16 -16
- package/src/ai/openapi-components.ts +1 -1
- package/src/ai/serializers.ts +1 -1
- package/src/ai/visibility.ts +1 -1
- package/src/astro/generate.ts +19 -18
- package/src/astro/module-types.ts +1 -1
- package/src/astro/runtime-deps.ts +6 -6
- package/src/astro/templates.ts +26 -26
- package/src/blume-modules.d.ts +2 -2
- package/src/cli/commands/audit.ts +1 -1
- package/src/cli/commands/doctor.ts +7 -5
- package/src/cli/commands/eval.ts +3 -3
- package/src/cli/commands/migrate.ts +2 -2
- package/src/cli/commands/translate.ts +3 -3
- package/src/cli/commands/upgrade.ts +2 -2
- package/src/cli/required-secrets.ts +3 -3
- package/src/components/copy-feedback.ts +1 -1
- package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
- package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
- package/src/components/islands/hooks.ts +14 -12
- package/src/components/layout/Header.astro +10 -10
- package/src/components/layout/PageLayout.astro +6 -6
- package/src/components/layout/Pagination.astro +7 -7
- package/src/components/layout/ReferenceLayout.astro +1 -1
- package/src/components/layout/RootLayout.astro +6 -6
- package/src/components/layout/Search.astro +13 -13
- package/src/components/layout/analytics-client.ts +1 -1
- package/src/components/layout/drawer-inert.ts +1 -1
- package/src/components/openapi/description.ts +2 -2
- package/src/core/code-fences.ts +1 -1
- package/src/core/config-input.ts +19 -19
- package/src/core/config.ts +3 -3
- package/src/core/data.ts +3 -3
- package/src/core/i18n-ui.ts +35 -9
- package/src/core/request-body.ts +1 -1
- package/src/core/schema.ts +25 -20
- package/src/core/server-features.ts +2 -2
- package/src/core/ui-packs/ar.ts +4 -5
- package/src/core/ui-packs/bg.ts +4 -5
- package/src/core/ui-packs/bn.ts +4 -5
- package/src/core/ui-packs/ca.ts +4 -5
- package/src/core/ui-packs/cs.ts +4 -5
- package/src/core/ui-packs/da.ts +4 -5
- package/src/core/ui-packs/de.ts +4 -5
- package/src/core/ui-packs/el.ts +4 -5
- package/src/core/ui-packs/es.ts +4 -5
- package/src/core/ui-packs/fa.ts +4 -5
- package/src/core/ui-packs/fi.ts +4 -5
- package/src/core/ui-packs/fr.ts +4 -5
- package/src/core/ui-packs/he.ts +4 -5
- package/src/core/ui-packs/hi.ts +4 -5
- package/src/core/ui-packs/hr.ts +4 -5
- package/src/core/ui-packs/hu.ts +4 -5
- package/src/core/ui-packs/id.ts +4 -5
- package/src/core/ui-packs/it.ts +4 -5
- package/src/core/ui-packs/ja.ts +4 -5
- package/src/core/ui-packs/ko.ts +4 -5
- package/src/core/ui-packs/nl.ts +4 -5
- package/src/core/ui-packs/no.ts +4 -5
- package/src/core/ui-packs/pl.ts +4 -5
- package/src/core/ui-packs/pt-br.ts +4 -5
- package/src/core/ui-packs/pt.ts +4 -5
- package/src/core/ui-packs/ro.ts +4 -5
- package/src/core/ui-packs/ru.ts +4 -5
- package/src/core/ui-packs/sk.ts +4 -5
- package/src/core/ui-packs/sr.ts +4 -5
- package/src/core/ui-packs/sv.ts +4 -5
- package/src/core/ui-packs/th.ts +4 -5
- package/src/core/ui-packs/tr.ts +4 -5
- package/src/core/ui-packs/uk.ts +4 -5
- package/src/core/ui-packs/vi.ts +4 -5
- package/src/core/ui-packs/zh-tw.ts +4 -5
- package/src/core/ui-packs/zh.ts +4 -5
- package/src/core/unrecognized-keys.ts +1 -1
- package/src/registry/eject.ts +19 -18
- package/src/search/documents.ts +2 -2
- package/src/search/orama-index.ts +1 -1
- package/src/translate/report.ts +1 -1
- package/src/upgrade/upgrade.ts +1 -1
- package/dist/cli/chunk-mnqj32sj.js.map +0 -12
- package/dist/cli/chunk-mwt1k8n7.js.map +0 -10
- /package/dist/cli/{chunk-f7t03s3g.js.map → chunk-27g6wdth.js.map} +0 -0
- /package/dist/cli/{chunk-by2290sx.js.map → chunk-5shv93fd.js.map} +0 -0
- /package/dist/cli/{chunk-nk3ts2xk.js.map → chunk-82bbrxdn.js.map} +0 -0
- /package/dist/cli/{chunk-zxccj738.js.map → chunk-ce574jw2.js.map} +0 -0
- /package/dist/cli/{chunk-y3e45rc8.js.map → chunk-ch6g3ar0.js.map} +0 -0
- /package/dist/cli/{chunk-1w8dp3qb.js.map → chunk-epjnccmv.js.map} +0 -0
- /package/dist/cli/{chunk-ernrthtr.js.map → chunk-f2z5v128.js.map} +0 -0
- /package/dist/cli/{chunk-zg2gtj10.js.map → chunk-fs23ddbb.js.map} +0 -0
- /package/dist/cli/{chunk-7ez8ny0t.js.map → chunk-fxypxtvm.js.map} +0 -0
- /package/dist/cli/{chunk-tzne8qfq.js.map → chunk-fz5wtpmh.js.map} +0 -0
- /package/dist/cli/{chunk-b5aj94ah.js.map → chunk-hdpx1tax.js.map} +0 -0
- /package/dist/cli/{chunk-fh5hj5jt.js.map → chunk-kdp5q7ke.js.map} +0 -0
- /package/dist/cli/{chunk-bctazmbk.js.map → chunk-mb2919y2.js.map} +0 -0
- /package/dist/cli/{chunk-79njf86q.js.map → chunk-q5163e60.js.map} +0 -0
- /package/dist/cli/{chunk-sqn5t4q0.js.map → chunk-qs4q5p4e.js.map} +0 -0
- /package/dist/cli/{chunk-bw22s759.js.map → chunk-qwsrynx5.js.map} +0 -0
- /package/dist/cli/{chunk-z01ze5c1.js.map → chunk-s1p84fyh.js.map} +0 -0
- /package/dist/cli/{chunk-f2972sbt.js.map → chunk-vtk4a6dg.js.map} +0 -0
- /package/dist/cli/{chunk-d1tadaw7.js.map → chunk-yt5n7ppj.js.map} +0 -0
- /package/dist/cli/{chunk-88cpgt6h.js.map → chunk-zxcczpyx.js.map} +0 -0
- /package/dist/cli/{chunk-41za066z.js.map → chunk-zxh4d9vy.js.map} +0 -0
package/src/core/config-input.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
492
|
-
export interface
|
|
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
|
|
500
|
-
export interface
|
|
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
|
|
522
|
-
export interface
|
|
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
|
|
535
|
+
/** Turn the assistant on. Defaults to `false`. */
|
|
536
536
|
enabled?: boolean;
|
|
537
537
|
/**
|
|
538
|
-
* Existing
|
|
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?:
|
|
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?:
|
|
564
|
+
retrieval?: AssistantRetrievalConfig;
|
|
565
565
|
/** Starter prompts shown before the first question. */
|
|
566
|
-
suggestions?:
|
|
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
|
|
634
|
+
/** Model-facing features: the assistant and the "Open in chat" action. */
|
|
635
635
|
export interface AiConfig {
|
|
636
|
-
/** The
|
|
637
|
-
|
|
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 (
|
|
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
|
|
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<
|
|
1455
|
+
Required<AssistantRetrievalConfig>,
|
|
1456
1456
|
Required<AskRetrievalOptions>
|
|
1457
1457
|
>;
|
|
1458
1458
|
type _AskRuntimeMatchesRetrieval = AssertExtends<
|
|
1459
1459
|
Required<AskRetrievalOptions>,
|
|
1460
|
-
Required<
|
|
1460
|
+
Required<AssistantRetrievalConfig>
|
|
1461
1461
|
>;
|
package/src/core/config.ts
CHANGED
|
@@ -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: `
|
|
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
|
|
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: {
|
|
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
|
-
/**
|
|
126
|
-
|
|
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"]["
|
|
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). */
|
package/src/core/i18n-ui.ts
CHANGED
|
@@ -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
|
-
|
|
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("
|
|
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
|
-
|
|
146
|
-
|
|
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
|
|
209
|
-
z.string(),
|
|
210
|
-
|
|
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 => {
|
package/src/core/request-body.ts
CHANGED
|
@@ -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
|
|
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
|
package/src/core/schema.ts
CHANGED
|
@@ -2,9 +2,9 @@ import type { AstroIntegration } from "astro";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
|
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.
|
|
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 (
|
|
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
|
|
824
|
+
/** Model-facing config: the assistant and the "Open in chat" action. */
|
|
825
825
|
const aiConfigFields = {
|
|
826
|
-
|
|
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
|
|
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:
|
|
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
|
|
856
|
+
// Unset means the gateway with its default model, so the zero-config assistant
|
|
857
857
|
// is unchanged.
|
|
858
|
-
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
|
-
|
|
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.
|
|
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(
|
|
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 {
|
|
992
|
-
export type {
|
|
993
|
-
export type
|
|
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 (
|
|
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
|
|
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.
|
|
11
|
-
features.push("
|
|
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) {
|
package/src/core/ui-packs/ar.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
86
|
+
assistant: "المساعد",
|
|
87
|
+
assistantHint: "احصل على إجابة فورية من الذكاء الاصطناعي",
|
|
89
88
|
button: "بحث",
|
|
90
89
|
devOnly: "البحث متاح في إصدار الإنتاج.",
|
|
91
90
|
error: "حدث خطأ ما. يرجى المحاولة مرة أخرى.",
|
package/src/core/ui-packs/bg.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
87
|
+
assistant: "Асистент",
|
|
88
|
+
assistantHint: "Получете незабавен отговор от ИИ",
|
|
90
89
|
button: "Търсене",
|
|
91
90
|
devOnly: "Търсенето е достъпно в производствената компилация.",
|
|
92
91
|
error: "Нещо се обърка. Моля, опитайте отново.",
|
package/src/core/ui-packs/bn.ts
CHANGED
|
@@ -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
|
-
|
|
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: "
|
|
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
|
-
|
|
88
|
-
|
|
86
|
+
assistant: "সহকারী",
|
|
87
|
+
assistantHint: "AI থেকে তাৎক্ষণিক উত্তর পান",
|
|
89
88
|
button: "অনুসন্ধান",
|
|
90
89
|
devOnly: "অনুসন্ধান প্রোডাকশন বিল্ডে উপলব্ধ।",
|
|
91
90
|
error: "কিছু একটা ভুল হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।",
|
package/src/core/ui-packs/ca.ts
CHANGED
|
@@ -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
|
-
|
|
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: "
|
|
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
|
-
|
|
89
|
-
|
|
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.",
|
package/src/core/ui-packs/cs.ts
CHANGED
|
@@ -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
|
-
|
|
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: "
|
|
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
|
-
|
|
88
|
-
|
|
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.",
|
package/src/core/ui-packs/da.ts
CHANGED
|
@@ -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
|
-
|
|
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: "
|
|
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
|
-
|
|
88
|
-
|
|
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.",
|
package/src/core/ui-packs/de.ts
CHANGED
|
@@ -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
|
-
|
|
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: "
|
|
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
|
-
|
|
89
|
-
|
|
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.",
|