best-email-builder 0.8.0 → 0.9.0
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/CHANGELOG.md +21 -0
- package/README.md +3 -3
- package/dist/ai-server.js +1 -1
- package/dist/ai.js +126 -56
- package/dist/ai.js.map +1 -1
- package/dist/builder.js +4 -4
- package/dist/{chunk-FAEVYSIF.js → chunk-4IXP5YVN.js} +2 -2
- package/dist/{chunk-FAEVYSIF.js.map → chunk-4IXP5YVN.js.map} +1 -1
- package/dist/{chunk-6W3QUZR7.js → chunk-AS2EPMA6.js} +4 -4
- package/dist/{chunk-DXWIVGHP.js → chunk-D4JBPAJ5.js} +2 -2
- package/dist/{chunk-ITIG5NTJ.js → chunk-FFSSAMHH.js} +3 -3
- package/dist/{chunk-WM2EEV4Q.js → chunk-GWXY3MWQ.js} +3 -3
- package/dist/{chunk-SHHHYRPC.js → chunk-VJKF6SR4.js} +61 -7
- package/dist/chunk-VJKF6SR4.js.map +1 -0
- package/dist/index.js +5 -5
- package/dist/library.js +4 -4
- package/dist/server.js +1 -1
- package/dist/types/ai/ConnectAi.d.ts +3 -1
- package/dist/types/ai/ModelPicker.d.ts +7 -3
- package/dist/types/ai/keys.d.ts +15 -3
- package/dist/types/core/constants.d.ts +1 -1
- package/dist/types/engine/NativeAdapter.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-SHHHYRPC.js.map +0 -1
- /package/dist/{chunk-6W3QUZR7.js.map → chunk-AS2EPMA6.js.map} +0 -0
- /package/dist/{chunk-DXWIVGHP.js.map → chunk-D4JBPAJ5.js.map} +0 -0
- /package/dist/{chunk-ITIG5NTJ.js.map → chunk-FFSSAMHH.js.map} +0 -0
- /package/dist/{chunk-WM2EEV4Q.js.map → chunk-GWXY3MWQ.js.map} +0 -0
package/dist/builder.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EmailBuilder,
|
|
3
3
|
EmailBuilderBoundary
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-AS2EPMA6.js";
|
|
5
5
|
import {
|
|
6
6
|
STARTER_MJML,
|
|
7
7
|
TEMPLATE_GALLERY,
|
|
8
8
|
buildGallery,
|
|
9
9
|
createStarterMjml
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GWXY3MWQ.js";
|
|
11
11
|
import "./chunk-G4U6PSF6.js";
|
|
12
12
|
import "./chunk-UFKCLU2D.js";
|
|
13
13
|
import "./chunk-P7ABBLX6.js";
|
|
@@ -15,10 +15,10 @@ import {
|
|
|
15
15
|
StorageError,
|
|
16
16
|
createHttpStorage,
|
|
17
17
|
createMemoryStorage
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-D4JBPAJ5.js";
|
|
19
19
|
import {
|
|
20
20
|
EMAIL_BUILDER_VERSION
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-4IXP5YVN.js";
|
|
22
22
|
import "./chunk-OWVXKMLI.js";
|
|
23
23
|
import "./chunk-AXIM6E7T.js";
|
|
24
24
|
import {
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-62HBUBBI.js";
|
|
4
4
|
|
|
5
5
|
// src/core/constants.js
|
|
6
|
-
var EMAIL_BUILDER_VERSION = "0.
|
|
6
|
+
var EMAIL_BUILDER_VERSION = "0.9.0";
|
|
7
7
|
var EMAIL_DOCUMENT_SCHEMA_VERSION = 1;
|
|
8
8
|
var EMAIL_DEVICES = ["desktop", "mobile"];
|
|
9
9
|
var EMAIL_MOBILE_WIDTH = 375;
|
|
@@ -116,4 +116,4 @@ export {
|
|
|
116
116
|
detectImage,
|
|
117
117
|
imageUploadError
|
|
118
118
|
};
|
|
119
|
-
//# sourceMappingURL=chunk-
|
|
119
|
+
//# sourceMappingURL=chunk-4IXP5YVN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/constants.js","../src/core/document.js","../src/validation/images.js"],"sourcesContent":["// @ts-check\n/**\n * Email builder constants.\n *\n * `EMAIL_BUILDER_VERSION` versions THIS package (UI, blocks, rendering);\n * `EMAIL_DOCUMENT_SCHEMA_VERSION` versions the stored JSON envelope (the\n * project JSON). Both are written with every template, so a document read by\n * a newer version knows whether it must be migrated (see `core/document.js`).\n */\n\nexport const EMAIL_BUILDER_VERSION = '0.
|
|
1
|
+
{"version":3,"sources":["../src/core/constants.js","../src/core/document.js","../src/validation/images.js"],"sourcesContent":["// @ts-check\n/**\n * Email builder constants.\n *\n * `EMAIL_BUILDER_VERSION` versions THIS package (UI, blocks, rendering);\n * `EMAIL_DOCUMENT_SCHEMA_VERSION` versions the stored JSON envelope (the\n * project JSON). Both are written with every template, so a document read by\n * a newer version knows whether it must be migrated (see `core/document.js`).\n */\n\nexport const EMAIL_BUILDER_VERSION = '0.9.0';\n\nexport const EMAIL_DOCUMENT_SCHEMA_VERSION = 1;\n\n/** @typedef {'desktop'|'mobile'} EmailDevice */\n\n/** @type {EmailDevice[]} */\nexport const EMAIL_DEVICES = ['desktop', 'mobile'];\n\n/** Content column width — the email client standard. */\nexport const EMAIL_CONTENT_WIDTH = 600;\n\n/** Mobile preview frame width (standard iPhone, the common worst case). */\nexport const EMAIL_MOBILE_WIDTH = 375;\n","// @ts-check\n/**\n * DOCUMENT envelope — what gets stored (the project JSON).\n *\n * HTML is only a compilation output; what gets edited is the engine's\n * project. It is not stored bare but wrapped with:\n *\n * schemaVersion the shape of THIS envelope (migrations, see MIGRATIONS);\n * engine the engine that can read `project` back;\n * engineVersion its version at write time;\n * builderVersion the builder version that wrote it;\n * project the engine data, opaque to the rest of the code.\n *\n * A document from another engine, a future schema or a malformed one is\n * REJECTED on read rather than half-loaded: a template silently emptied and\n * then saved again would be lost.\n *\n * Dependency-free module: testable outside the browser.\n */\n\nimport { EMAIL_BUILDER_VERSION, EMAIL_DOCUMENT_SCHEMA_VERSION } from './constants.js';\n\n/**\n * @typedef {{\n * schemaVersion: number,\n * engine: string,\n * engineVersion: string,\n * builderVersion: string,\n * project: Record<string, any>,\n * }} EmailDocument\n */\n\n/**\n * Envelope migrations, from N to N+1. Empty while only one schema exists; the\n * first entry will be `1: (doc) => ({ ...doc, schemaVersion: 2 })`.\n *\n * @type {Record<number, (document: any) => any>}\n */\nconst MIGRATIONS = {};\n\nexport class EmailDocumentError extends Error {\n /** @param {string} message */\n constructor(message) {\n super(message);\n this.name = 'EmailDocumentError';\n this.status = 422;\n }\n}\n\nfunction isPlainObject(value) {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * @param {{engine: string, engineVersion: string, project: object}} parts\n * @returns {EmailDocument}\n */\nexport function createDocument({ engine, engineVersion, project }) {\n if (!engine) throw new EmailDocumentError('Document: missing engine');\n if (!isPlainObject(project)) throw new EmailDocumentError('Document: invalid engine project');\n return {\n schemaVersion: EMAIL_DOCUMENT_SCHEMA_VERSION,\n engine,\n engineVersion: String(engineVersion || ''),\n builderVersion: EMAIL_BUILDER_VERSION,\n project: /** @type {Record<string, any>} */ (project),\n };\n}\n\n/**\n * Reads a document (object or JSON string), migrates it to the current schema\n * and validates it.\n *\n * @param {unknown} raw\n * @returns {EmailDocument}\n * @throws {EmailDocumentError}\n */\nexport function readDocument(raw) {\n let value = raw;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n throw new EmailDocumentError('Unreadable document: invalid JSON');\n }\n }\n if (!isPlainObject(value)) throw new EmailDocumentError('Unreadable document: object expected');\n\n /** @type {any} */\n let document = { ...(/** @type {object} */ (value)) };\n const version = Number(document.schemaVersion);\n if (!Number.isInteger(version) || version < 1) {\n throw new EmailDocumentError('Unreadable document: missing schema version');\n }\n if (version > EMAIL_DOCUMENT_SCHEMA_VERSION) {\n throw new EmailDocumentError(\n `Document written by a newer version of the builder (schema ${version}) — ` +\n 'reload the page'\n );\n }\n for (let v = version; v < EMAIL_DOCUMENT_SCHEMA_VERSION; v += 1) {\n const migrate = MIGRATIONS[v];\n if (!migrate) throw new EmailDocumentError(`Document: no migration from schema ${v}`);\n document = migrate(document);\n }\n\n if (typeof document.engine !== 'string' || !document.engine) {\n throw new EmailDocumentError('Unreadable document: missing engine');\n }\n if (!isPlainObject(document.project)) {\n throw new EmailDocumentError('Unreadable document: missing engine project');\n }\n\n return {\n schemaVersion: EMAIL_DOCUMENT_SCHEMA_VERSION,\n engine: document.engine,\n engineVersion: String(document.engineVersion || ''),\n builderVersion: String(document.builderVersion || ''),\n project: document.project,\n };\n}\n\n/** @param {EmailDocument} document */\nexport function serializeDocument(document) {\n return JSON.stringify(readDocument(document));\n}\n","// @ts-check\n/**\n * Images UPLOADED in the builder — one rule shared by the browser (immediate\n * rejection, storage/client.js) and the server (storage/server/assetFile.js).\n *\n * PNG, JPEG, GIF: the three formats every email client displays. WebP and SVG\n * do not display in Outlook, and an SVG can carry script.\n * The server reads the type from the file BYTES; the browser, from `file.type`.\n */\n\nimport { identity } from '../i18n/index.js';\n\n/** Maximum image size: beyond it, the email becomes slow to open. */\nexport const MAX_IMAGE_BYTES = 2 * 1024 * 1024;\n\n/** Accepted types → extension of the public key. */\nexport const IMAGE_TYPES = { 'image/png': 'png', 'image/jpeg': 'jpg', 'image/gif': 'gif' };\n\n/** Public key: 32 hex characters of the hash + extension. */\nexport const ASSET_KEY_PATTERN = /^[a-f0-9]{32}\\.(png|jpg|gif)$/;\n\nconst SIGNATURES = [\n { type: 'image/png', bytes: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a] },\n { type: 'image/jpeg', bytes: [0xff, 0xd8, 0xff] },\n { type: 'image/gif', bytes: [0x47, 0x49, 0x46, 0x38] },\n];\n\n/**\n * Image type detected from the file signature, or `null`.\n * @param {Uint8Array} bytes\n * @returns {{type: string, ext: string}|null}\n */\nexport function detectImage(bytes) {\n if (!bytes || bytes.length < 8) return null;\n const found = SIGNATURES.find((s) => s.bytes.every((b, i) => bytes[i] === b));\n return found ? { type: found.type, ext: IMAGE_TYPES[found.type] } : null;\n}\n\n/**\n * Immediate rejection of a file the server would refuse, or `null`.\n * @param {{type?: string, size?: number}} file\n * @param {{t?: import('../i18n/index.js').Translate}} [options]\n */\nexport function imageUploadError(file, { t = identity } = {}) {\n if (!(String(file?.type || '') in IMAGE_TYPES)) return t('Format rejected: PNG, JPEG or GIF expected');\n if (Number(file?.size || 0) > MAX_IMAGE_BYTES) {\n return t('Image too large: {max} MB maximum', { max: MAX_IMAGE_BYTES / (1024 * 1024) });\n }\n return null;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
useBrand,
|
|
11
11
|
useLayoutWidth,
|
|
12
12
|
withThumbnailImages
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-GWXY3MWQ.js";
|
|
14
14
|
import {
|
|
15
15
|
BRAND_NOTES,
|
|
16
16
|
countImagesWithoutPicture,
|
|
@@ -56,14 +56,14 @@ import {
|
|
|
56
56
|
useSearchShortcut,
|
|
57
57
|
useT,
|
|
58
58
|
useUi
|
|
59
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-D4JBPAJ5.js";
|
|
60
60
|
import {
|
|
61
61
|
EMAIL_BUILDER_VERSION,
|
|
62
62
|
EMAIL_DEVICES,
|
|
63
63
|
createDocument,
|
|
64
64
|
imageUploadError,
|
|
65
65
|
readDocument
|
|
66
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-4IXP5YVN.js";
|
|
67
67
|
import {
|
|
68
68
|
LONGHAND_SPACING,
|
|
69
69
|
MJML_DEFAULTS,
|
|
@@ -5586,4 +5586,4 @@ export {
|
|
|
5586
5586
|
EmailBuilder,
|
|
5587
5587
|
EmailBuilderBoundary
|
|
5588
5588
|
};
|
|
5589
|
-
//# sourceMappingURL=chunk-
|
|
5589
|
+
//# sourceMappingURL=chunk-AS2EPMA6.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
IMAGE_TYPES,
|
|
3
3
|
imageUploadError,
|
|
4
4
|
readDocument
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-4IXP5YVN.js";
|
|
6
6
|
import {
|
|
7
7
|
DEFAULT_ASSETS_PATH,
|
|
8
8
|
DEFAULT_VARIABLES,
|
|
@@ -892,4 +892,4 @@ export {
|
|
|
892
892
|
createHttpStorage,
|
|
893
893
|
createMemoryStorage
|
|
894
894
|
};
|
|
895
|
-
//# sourceMappingURL=chunk-
|
|
895
|
+
//# sourceMappingURL=chunk-D4JBPAJ5.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
useBrand,
|
|
6
6
|
useLayoutWidth,
|
|
7
7
|
withPlaceholderImages
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-GWXY3MWQ.js";
|
|
9
9
|
import {
|
|
10
10
|
Button,
|
|
11
11
|
Input,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
createHttpStorage,
|
|
19
19
|
useSearchShortcut,
|
|
20
20
|
useUi
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-D4JBPAJ5.js";
|
|
22
22
|
import {
|
|
23
23
|
brandTemplate,
|
|
24
24
|
brandedSender
|
|
@@ -524,4 +524,4 @@ function TemplateLibrary({ locale = "en", messages, onNotify, ...props }) {
|
|
|
524
524
|
export {
|
|
525
525
|
TemplateLibrary
|
|
526
526
|
};
|
|
527
|
-
//# sourceMappingURL=chunk-
|
|
527
|
+
//# sourceMappingURL=chunk-FFSSAMHH.js.map
|
|
@@ -15,10 +15,10 @@ import {
|
|
|
15
15
|
TabsTrigger,
|
|
16
16
|
cn,
|
|
17
17
|
useUi
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-D4JBPAJ5.js";
|
|
19
19
|
import {
|
|
20
20
|
EMAIL_MOBILE_WIDTH
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-4IXP5YVN.js";
|
|
22
22
|
import {
|
|
23
23
|
DEFAULT_BUTTON_URL,
|
|
24
24
|
FONT_STACK,
|
|
@@ -592,4 +592,4 @@ export {
|
|
|
592
592
|
useBrand,
|
|
593
593
|
useLayoutWidth
|
|
594
594
|
};
|
|
595
|
-
//# sourceMappingURL=chunk-
|
|
595
|
+
//# sourceMappingURL=chunk-GWXY3MWQ.js.map
|
|
@@ -1404,7 +1404,16 @@ var de = {
|
|
|
1404
1404
|
"The list of models could not be loaded. The default model works, or type the id of another.": "Die Modellliste konnte nicht geladen werden. Das Standardmodell funktioniert, oder geben Sie die ID eines anderen ein.",
|
|
1405
1405
|
"{count} models, the free ones first.": "Modelle: {count}, die kostenlosen zuerst.",
|
|
1406
1406
|
"{count} models.": "Modelle: {count}.",
|
|
1407
|
-
"{provider} lists no models here: type the id of the one you want.": "{provider} listet hier keine Modelle auf: Geben Sie die ID des gew\xFCnschten Modells ein."
|
|
1407
|
+
"{provider} lists no models here: type the id of the one you want.": "{provider} listet hier keine Modelle auf: Geben Sie die ID des gew\xFCnschten Modells ein.",
|
|
1408
|
+
"The AI writes with an OpenAI-compatible API of your choice. Give its address, and its key if it needs one: this browser remembers them.": "Die KI schreibt mit einer OpenAI-kompatiblen API Ihrer Wahl. Geben Sie ihre Adresse an und, falls n\xF6tig, ihren Schl\xFCssel: Dieser Browser merkt sie sich.",
|
|
1409
|
+
"API address": "API-Adresse",
|
|
1410
|
+
"Any API that speaks OpenAI: LM Studio, vLLM, Ollama, a proxy of your own\u2026 It must accept requests from this page (CORS).": "Jede API, die OpenAI spricht: LM Studio, vLLM, Ollama, ein eigener Proxy \u2026 Sie muss Anfragen von dieser Seite annehmen (CORS).",
|
|
1411
|
+
"An address starts with http:// or https://.": "Eine Adresse beginnt mit http:// oder https://.",
|
|
1412
|
+
"API key (optional)": "API-Schl\xFCssel (optional)",
|
|
1413
|
+
"Leave it empty if the API needs no key.": "Leer lassen, wenn die API keinen Schl\xFCssel braucht.",
|
|
1414
|
+
"The address and the key stay in this browser; the key is sent only to that address.": "Adresse und Schl\xFCssel bleiben in diesem Browser; der Schl\xFCssel wird nur an diese Adresse gesendet.",
|
|
1415
|
+
"Give the API address to see its models.": "Geben Sie die API-Adresse an, um ihre Modelle zu sehen.",
|
|
1416
|
+
"The list of models could not be loaded. Type the id of the model.": "Die Modellliste konnte nicht geladen werden. Geben Sie die ID des Modells ein."
|
|
1408
1417
|
};
|
|
1409
1418
|
|
|
1410
1419
|
// src/ai/i18n/es.js
|
|
@@ -1570,7 +1579,16 @@ var es = {
|
|
|
1570
1579
|
"The list of models could not be loaded. The default model works, or type the id of another.": "No se pudo cargar la lista de modelos. El modelo predeterminado funciona, o escribe el ID de otro.",
|
|
1571
1580
|
"{count} models, the free ones first.": "Modelos: {count}, primero los gratuitos.",
|
|
1572
1581
|
"{count} models.": "Modelos: {count}.",
|
|
1573
|
-
"{provider} lists no models here: type the id of the one you want.": "{provider} no muestra modelos aqu\xED: escribe el ID del que quieras."
|
|
1582
|
+
"{provider} lists no models here: type the id of the one you want.": "{provider} no muestra modelos aqu\xED: escribe el ID del que quieras.",
|
|
1583
|
+
"The AI writes with an OpenAI-compatible API of your choice. Give its address, and its key if it needs one: this browser remembers them.": "La IA escribe con una API compatible con OpenAI que t\xFA elijas. Indica su direcci\xF3n, y su clave si la pide: este navegador las recuerda.",
|
|
1584
|
+
"API address": "Direcci\xF3n de la API",
|
|
1585
|
+
"Any API that speaks OpenAI: LM Studio, vLLM, Ollama, a proxy of your own\u2026 It must accept requests from this page (CORS).": "Cualquier API que hable OpenAI: LM Studio, vLLM, Ollama, un proxy propio\u2026 Debe aceptar peticiones de esta p\xE1gina (CORS).",
|
|
1586
|
+
"An address starts with http:// or https://.": "Una direcci\xF3n empieza por http:// o https://.",
|
|
1587
|
+
"API key (optional)": "Clave API (opcional)",
|
|
1588
|
+
"Leave it empty if the API needs no key.": "D\xE9jalo vac\xEDo si la API no pide clave.",
|
|
1589
|
+
"The address and the key stay in this browser; the key is sent only to that address.": "La direcci\xF3n y la clave se quedan en este navegador; la clave solo se env\xEDa a esa direcci\xF3n.",
|
|
1590
|
+
"Give the API address to see its models.": "Indica la direcci\xF3n de la API para ver sus modelos.",
|
|
1591
|
+
"The list of models could not be loaded. Type the id of the model.": "No se pudo cargar la lista de modelos. Escribe el ID del modelo."
|
|
1574
1592
|
};
|
|
1575
1593
|
|
|
1576
1594
|
// src/ai/i18n/fr.js
|
|
@@ -1736,7 +1754,16 @@ var fr = {
|
|
|
1736
1754
|
"The list of models could not be loaded. The default model works, or type the id of another.": "La liste des mod\xE8les n'a pas pu \xEAtre charg\xE9e. Le mod\xE8le par d\xE9faut fonctionne, ou tapez l'identifiant d'un autre.",
|
|
1737
1755
|
"{count} models, the free ones first.": "{count} mod\xE8les, les gratuits en premier.",
|
|
1738
1756
|
"{count} models.": "{count} mod\xE8les.",
|
|
1739
|
-
"{provider} lists no models here: type the id of the one you want.": "{provider} ne liste aucun mod\xE8le ici : tapez l'identifiant de celui que vous voulez."
|
|
1757
|
+
"{provider} lists no models here: type the id of the one you want.": "{provider} ne liste aucun mod\xE8le ici : tapez l'identifiant de celui que vous voulez.",
|
|
1758
|
+
"The AI writes with an OpenAI-compatible API of your choice. Give its address, and its key if it needs one: this browser remembers them.": "L'IA \xE9crit avec une API compatible OpenAI de votre choix. Indiquez son adresse, et sa cl\xE9 si elle en demande une : ce navigateur s'en souvient.",
|
|
1759
|
+
"API address": "Adresse de l'API",
|
|
1760
|
+
"Any API that speaks OpenAI: LM Studio, vLLM, Ollama, a proxy of your own\u2026 It must accept requests from this page (CORS).": "Toute API qui parle OpenAI : LM Studio, vLLM, Ollama, un proxy \xE0 vous\u2026 Elle doit accepter les requ\xEAtes de cette page (CORS).",
|
|
1761
|
+
"An address starts with http:// or https://.": "Une adresse commence par http:// ou https://.",
|
|
1762
|
+
"API key (optional)": "Cl\xE9 API (facultatif)",
|
|
1763
|
+
"Leave it empty if the API needs no key.": "Laissez vide si l'API ne demande pas de cl\xE9.",
|
|
1764
|
+
"The address and the key stay in this browser; the key is sent only to that address.": "L'adresse et la cl\xE9 restent dans ce navigateur ; la cl\xE9 n'est envoy\xE9e qu'\xE0 cette adresse.",
|
|
1765
|
+
"Give the API address to see its models.": "Indiquez l'adresse de l'API pour voir ses mod\xE8les.",
|
|
1766
|
+
"The list of models could not be loaded. Type the id of the model.": "La liste des mod\xE8les n'a pas pu \xEAtre charg\xE9e. Tapez l'identifiant du mod\xE8le."
|
|
1740
1767
|
};
|
|
1741
1768
|
|
|
1742
1769
|
// src/ai/i18n/pt.js
|
|
@@ -1902,7 +1929,16 @@ var pt = {
|
|
|
1902
1929
|
"The list of models could not be loaded. The default model works, or type the id of another.": "N\xE3o foi poss\xEDvel carregar a lista de modelos. O modelo padr\xE3o funciona, ou digite o ID de outro.",
|
|
1903
1930
|
"{count} models, the free ones first.": "Modelos: {count}, os gratuitos primeiro.",
|
|
1904
1931
|
"{count} models.": "Modelos: {count}.",
|
|
1905
|
-
"{provider} lists no models here: type the id of the one you want.": "{provider} n\xE3o lista modelos aqui: digite o ID do que voc\xEA quer."
|
|
1932
|
+
"{provider} lists no models here: type the id of the one you want.": "{provider} n\xE3o lista modelos aqui: digite o ID do que voc\xEA quer.",
|
|
1933
|
+
"The AI writes with an OpenAI-compatible API of your choice. Give its address, and its key if it needs one: this browser remembers them.": "A IA escreve com uma API compat\xEDvel com OpenAI \xE0 sua escolha. Informe o endere\xE7o dela, e a chave se ela pedir uma: este navegador lembra deles.",
|
|
1934
|
+
"API address": "Endere\xE7o da API",
|
|
1935
|
+
"Any API that speaks OpenAI: LM Studio, vLLM, Ollama, a proxy of your own\u2026 It must accept requests from this page (CORS).": "Qualquer API que fale OpenAI: LM Studio, vLLM, Ollama, um proxy seu\u2026 Ela precisa aceitar requisi\xE7\xF5es desta p\xE1gina (CORS).",
|
|
1936
|
+
"An address starts with http:// or https://.": "Um endere\xE7o come\xE7a com http:// ou https://.",
|
|
1937
|
+
"API key (optional)": "Chave de API (opcional)",
|
|
1938
|
+
"Leave it empty if the API needs no key.": "Deixe em branco se a API n\xE3o pedir chave.",
|
|
1939
|
+
"The address and the key stay in this browser; the key is sent only to that address.": "O endere\xE7o e a chave ficam neste navegador; a chave s\xF3 \xE9 enviada para esse endere\xE7o.",
|
|
1940
|
+
"Give the API address to see its models.": "Informe o endere\xE7o da API para ver os modelos dela.",
|
|
1941
|
+
"The list of models could not be loaded. Type the id of the model.": "N\xE3o foi poss\xEDvel carregar a lista de modelos. Digite o ID do modelo."
|
|
1906
1942
|
};
|
|
1907
1943
|
|
|
1908
1944
|
// src/ai/i18n/ru.js
|
|
@@ -2068,7 +2104,16 @@ var ru = {
|
|
|
2068
2104
|
"The list of models could not be loaded. The default model works, or type the id of another.": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u043F\u0438\u0441\u043E\u043A \u043C\u043E\u0434\u0435\u043B\u0435\u0439. \u041C\u043E\u0434\u0435\u043B\u044C \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u2014 \u0438\u043B\u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0434\u0440\u0443\u0433\u043E\u0439.",
|
|
2069
2105
|
"{count} models, the free ones first.": "\u041C\u043E\u0434\u0435\u043B\u0435\u0439: {count}, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u044B\u0435.",
|
|
2070
2106
|
"{count} models.": "\u041C\u043E\u0434\u0435\u043B\u0435\u0439: {count}.",
|
|
2071
|
-
"{provider} lists no models here: type the id of the one you want.": "\u0421\u043F\u0438\u0441\u043E\u043A \u043C\u043E\u0434\u0435\u043B\u0435\u0439 {provider} \u0437\u0434\u0435\u0441\u044C \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D: \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u043D\u0443\u0436\u043D\u043E\u0439 \u043C\u043E\u0434\u0435\u043B\u0438."
|
|
2107
|
+
"{provider} lists no models here: type the id of the one you want.": "\u0421\u043F\u0438\u0441\u043E\u043A \u043C\u043E\u0434\u0435\u043B\u0435\u0439 {provider} \u0437\u0434\u0435\u0441\u044C \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D: \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u043D\u0443\u0436\u043D\u043E\u0439 \u043C\u043E\u0434\u0435\u043B\u0438.",
|
|
2108
|
+
"The AI writes with an OpenAI-compatible API of your choice. Give its address, and its key if it needs one: this browser remembers them.": "\u0418\u0418 \u043F\u0438\u0448\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 OpenAI-\u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u044B\u0439 API \u043D\u0430 \u0432\u0430\u0448 \u0432\u044B\u0431\u043E\u0440. \u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0435\u0433\u043E \u0430\u0434\u0440\u0435\u0441 \u0438 \u043A\u043B\u044E\u0447, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0443\u0436\u0435\u043D: \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438\u0445 \u0437\u0430\u043F\u043E\u043C\u043D\u0438\u0442.",
|
|
2109
|
+
"API address": "\u0410\u0434\u0440\u0435\u0441 API",
|
|
2110
|
+
"Any API that speaks OpenAI: LM Studio, vLLM, Ollama, a proxy of your own\u2026 It must accept requests from this page (CORS).": "\u041B\u044E\u0431\u043E\u0439 API, \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u044B\u0439 \u0441 OpenAI: LM Studio, vLLM, Ollama, \u0432\u0430\u0448 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u043A\u0441\u0438\u2026 \u041E\u043D \u0434\u043E\u043B\u0436\u0435\u043D \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C \u0437\u0430\u043F\u0440\u043E\u0441\u044B \u0441 \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B (CORS).",
|
|
2111
|
+
"An address starts with http:// or https://.": "\u0410\u0434\u0440\u0435\u0441 \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441 http:// \u0438\u043B\u0438 https://.",
|
|
2112
|
+
"API key (optional)": "API-\u043A\u043B\u044E\u0447 (\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)",
|
|
2113
|
+
"Leave it empty if the API needs no key.": "\u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C, \u0435\u0441\u043B\u0438 API \u043D\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043A\u043B\u044E\u0447\u0430.",
|
|
2114
|
+
"The address and the key stay in this browser; the key is sent only to that address.": "\u0410\u0434\u0440\u0435\u0441 \u0438 \u043A\u043B\u044E\u0447 \u0445\u0440\u0430\u043D\u044F\u0442\u0441\u044F \u0432 \u044D\u0442\u043E\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435; \u043A\u043B\u044E\u0447 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E \u044D\u0442\u043E\u043C\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.",
|
|
2115
|
+
"Give the API address to see its models.": "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 API, \u0447\u0442\u043E\u0431\u044B \u0443\u0432\u0438\u0434\u0435\u0442\u044C \u0435\u0433\u043E \u043C\u043E\u0434\u0435\u043B\u0438.",
|
|
2116
|
+
"The list of models could not be loaded. Type the id of the model.": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u043F\u0438\u0441\u043E\u043A \u043C\u043E\u0434\u0435\u043B\u0435\u0439. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u043C\u043E\u0434\u0435\u043B\u0438."
|
|
2072
2117
|
};
|
|
2073
2118
|
|
|
2074
2119
|
// src/ai/i18n/zh.js
|
|
@@ -2234,7 +2279,16 @@ var zh = {
|
|
|
2234
2279
|
"The list of models could not be loaded. The default model works, or type the id of another.": "\u65E0\u6CD5\u52A0\u8F7D\u6A21\u578B\u5217\u8868\u3002\u53EF\u4EE5\u4F7F\u7528\u9ED8\u8BA4\u6A21\u578B\uFF0C\u6216\u8F93\u5165\u5176\u4ED6\u6A21\u578B\u7684 ID\u3002",
|
|
2235
2280
|
"{count} models, the free ones first.": "\u5171 {count} \u4E2A\u6A21\u578B\uFF0C\u514D\u8D39\u6A21\u578B\u4F18\u5148\u663E\u793A\u3002",
|
|
2236
2281
|
"{count} models.": "\u5171 {count} \u4E2A\u6A21\u578B\u3002",
|
|
2237
|
-
"{provider} lists no models here: type the id of the one you want.": "{provider} \u672A\u5728\u6B64\u5217\u51FA\u4EFB\u4F55\u6A21\u578B\uFF0C\u8BF7\u8F93\u5165\u6240\u9700\u6A21\u578B\u7684 ID\u3002"
|
|
2282
|
+
"{provider} lists no models here: type the id of the one you want.": "{provider} \u672A\u5728\u6B64\u5217\u51FA\u4EFB\u4F55\u6A21\u578B\uFF0C\u8BF7\u8F93\u5165\u6240\u9700\u6A21\u578B\u7684 ID\u3002",
|
|
2283
|
+
"The AI writes with an OpenAI-compatible API of your choice. Give its address, and its key if it needs one: this browser remembers them.": "AI \u5C06\u4F7F\u7528\u60A8\u9009\u62E9\u7684 OpenAI \u517C\u5BB9 API \u64B0\u5199\u3002\u8BF7\u586B\u5199\u5176\u5730\u5740\uFF0C\u5982\u9700\u5BC6\u94A5\u4E5F\u4E00\u5E76\u586B\u5199\uFF1A\u6B64\u6D4F\u89C8\u5668\u4F1A\u8BB0\u4F4F\u5B83\u4EEC\u3002",
|
|
2284
|
+
"API address": "API \u5730\u5740",
|
|
2285
|
+
"Any API that speaks OpenAI: LM Studio, vLLM, Ollama, a proxy of your own\u2026 It must accept requests from this page (CORS).": "\u4EFB\u4F55\u517C\u5BB9 OpenAI \u7684 API\uFF1ALM Studio\u3001vLLM\u3001Ollama\u3001\u60A8\u81EA\u5DF1\u7684\u4EE3\u7406\u2026\u2026 \u5B83\u5FC5\u987B\u63A5\u53D7\u6765\u81EA\u6B64\u9875\u9762\u7684\u8BF7\u6C42\uFF08CORS\uFF09\u3002",
|
|
2286
|
+
"An address starts with http:// or https://.": "\u5730\u5740\u4EE5 http:// \u6216 https:// \u5F00\u5934\u3002",
|
|
2287
|
+
"API key (optional)": "API \u5BC6\u94A5\uFF08\u53EF\u9009\uFF09",
|
|
2288
|
+
"Leave it empty if the API needs no key.": "\u5982\u679C\u8BE5 API \u4E0D\u9700\u8981\u5BC6\u94A5\uFF0C\u8BF7\u7559\u7A7A\u3002",
|
|
2289
|
+
"The address and the key stay in this browser; the key is sent only to that address.": "\u5730\u5740\u548C\u5BC6\u94A5\u4EC5\u4FDD\u5B58\u5728\u6B64\u6D4F\u89C8\u5668\u4E2D\uFF1B\u5BC6\u94A5\u53EA\u4F1A\u53D1\u9001\u5230\u8BE5\u5730\u5740\u3002",
|
|
2290
|
+
"Give the API address to see its models.": "\u586B\u5199 API \u5730\u5740\u5373\u53EF\u67E5\u770B\u5176\u6A21\u578B\u3002",
|
|
2291
|
+
"The list of models could not be loaded. Type the id of the model.": "\u65E0\u6CD5\u52A0\u8F7D\u6A21\u578B\u5217\u8868\u3002\u8BF7\u8F93\u5165\u6A21\u578B\u7684 ID\u3002"
|
|
2238
2292
|
};
|
|
2239
2293
|
|
|
2240
2294
|
// src/ai/i18n/index.js
|
|
@@ -2826,4 +2880,4 @@ export {
|
|
|
2826
2880
|
AGENT_ERROR_CODES,
|
|
2827
2881
|
agentEmailModel
|
|
2828
2882
|
};
|
|
2829
|
-
//# sourceMappingURL=chunk-
|
|
2883
|
+
//# sourceMappingURL=chunk-VJKF6SR4.js.map
|