@happyvertical/smrt-languages 0.30.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/AGENTS.md +81 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +193 -0
- package/dist/chunks/language-registry-CgsuwQo6.js +509 -0
- package/dist/chunks/language-registry-CgsuwQo6.js.map +1 -0
- package/dist/chunks/translation-job-DHg2E-eH.js +286 -0
- package/dist/chunks/translation-job-DHg2E-eH.js.map +1 -0
- package/dist/cli.d.ts +43 -0
- package/dist/cli.js +83 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +247 -0
- package/dist/index.js +242 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +62 -0
- package/dist/jobs.js +8 -0
- package/dist/jobs.js.map +1 -0
- package/dist/manifest.json +526 -0
- package/dist/smrt-knowledge.json +343 -0
- package/dist/types.d.ts +106 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"generatedAt": "2026-06-23T01:12:26.327Z",
|
|
4
|
+
"packageName": "@happyvertical/smrt-languages",
|
|
5
|
+
"packageVersion": "0.30.0",
|
|
6
|
+
"sourceManifestPath": "dist/manifest.json",
|
|
7
|
+
"agentDocPath": "AGENTS.md",
|
|
8
|
+
"sourceHashes": {
|
|
9
|
+
"manifest": "968f77b838ff801837e5f30a86bbbb51986650dda91319775662c35b296a7f1c",
|
|
10
|
+
"packageJson": "45ac17b9065adb17dbe98f73374dff00fcd1d27e033b43fd7d54c0697424a46c",
|
|
11
|
+
"agents": "6dc270bd9bb9c51d48f526396544ab2a54a071c42f60869f4806520818f7e864"
|
|
12
|
+
},
|
|
13
|
+
"exports": [
|
|
14
|
+
".",
|
|
15
|
+
"./cli",
|
|
16
|
+
"./jobs",
|
|
17
|
+
"./manifest",
|
|
18
|
+
"./manifest.json"
|
|
19
|
+
],
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@happyvertical/ai": "catalog:",
|
|
22
|
+
"@happyvertical/logger": "catalog:",
|
|
23
|
+
"@happyvertical/smrt-config": "workspace:*",
|
|
24
|
+
"@happyvertical/smrt-core": "workspace:*",
|
|
25
|
+
"@happyvertical/smrt-features": "workspace:*",
|
|
26
|
+
"@happyvertical/smrt-jobs": "workspace:*",
|
|
27
|
+
"@happyvertical/smrt-prompts": "workspace:*",
|
|
28
|
+
"@happyvertical/smrt-tenancy": "workspace:*",
|
|
29
|
+
"@happyvertical/sql": "catalog:",
|
|
30
|
+
"@happyvertical/smrt-cli": "workspace:*",
|
|
31
|
+
"@happyvertical/smrt-vitest": "workspace:*",
|
|
32
|
+
"@types/node": "24.10.9",
|
|
33
|
+
"typescript": "^5.9.3",
|
|
34
|
+
"vite": "^7.3.1",
|
|
35
|
+
"vitest": "^4.0.17"
|
|
36
|
+
},
|
|
37
|
+
"smrtDependencies": [
|
|
38
|
+
"@happyvertical/smrt-cli",
|
|
39
|
+
"@happyvertical/smrt-config",
|
|
40
|
+
"@happyvertical/smrt-core",
|
|
41
|
+
"@happyvertical/smrt-features",
|
|
42
|
+
"@happyvertical/smrt-jobs",
|
|
43
|
+
"@happyvertical/smrt-prompts",
|
|
44
|
+
"@happyvertical/smrt-tenancy",
|
|
45
|
+
"@happyvertical/smrt-vitest"
|
|
46
|
+
],
|
|
47
|
+
"sdkDependencies": [
|
|
48
|
+
"@happyvertical/ai",
|
|
49
|
+
"@happyvertical/logger",
|
|
50
|
+
"@happyvertical/sql"
|
|
51
|
+
],
|
|
52
|
+
"tags": [],
|
|
53
|
+
"risks": [],
|
|
54
|
+
"objects": [
|
|
55
|
+
{
|
|
56
|
+
"name": "LanguageTranslationTask",
|
|
57
|
+
"qualifiedName": "@happyvertical/smrt-languages:LanguageTranslationTask",
|
|
58
|
+
"collection": "languagetranslationtasks",
|
|
59
|
+
"tableName": "language_translation_tasks",
|
|
60
|
+
"packageName": "@happyvertical/smrt-languages",
|
|
61
|
+
"extends": "SmrtObject",
|
|
62
|
+
"fields": [],
|
|
63
|
+
"relationships": [],
|
|
64
|
+
"methods": [
|
|
65
|
+
"execute"
|
|
66
|
+
],
|
|
67
|
+
"surfaces": [],
|
|
68
|
+
"relationshipFeatures": [
|
|
69
|
+
"uuidColumns"
|
|
70
|
+
],
|
|
71
|
+
"tags": [],
|
|
72
|
+
"risks": []
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "LanguageOverrideCollection",
|
|
76
|
+
"qualifiedName": "@happyvertical/smrt-languages:LanguageOverrideCollection",
|
|
77
|
+
"collection": "languageoverrides",
|
|
78
|
+
"tableName": "_smrt_language_overrides",
|
|
79
|
+
"packageName": "@happyvertical/smrt-languages",
|
|
80
|
+
"extends": "SmrtCollection",
|
|
81
|
+
"fields": [],
|
|
82
|
+
"relationships": [],
|
|
83
|
+
"methods": [
|
|
84
|
+
"getAppOverride",
|
|
85
|
+
"getResolutionLayers",
|
|
86
|
+
"getTenantOverride",
|
|
87
|
+
"listTenantOverrides",
|
|
88
|
+
"listUnreviewedAutoTranslations"
|
|
89
|
+
],
|
|
90
|
+
"surfaces": [],
|
|
91
|
+
"relationshipFeatures": [
|
|
92
|
+
"uuidColumns"
|
|
93
|
+
],
|
|
94
|
+
"tags": [],
|
|
95
|
+
"risks": []
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"name": "LanguageOverride",
|
|
99
|
+
"qualifiedName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
100
|
+
"collection": "languageoverrides",
|
|
101
|
+
"tableName": "_smrt_language_overrides",
|
|
102
|
+
"packageName": "@happyvertical/smrt-languages",
|
|
103
|
+
"extends": "SmrtObject",
|
|
104
|
+
"fields": [
|
|
105
|
+
{
|
|
106
|
+
"name": "key",
|
|
107
|
+
"type": "text",
|
|
108
|
+
"required": true,
|
|
109
|
+
"columnType": "TEXT"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "locale",
|
|
113
|
+
"type": "text",
|
|
114
|
+
"required": true,
|
|
115
|
+
"columnType": "TEXT"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"name": "tenantId",
|
|
119
|
+
"type": "text",
|
|
120
|
+
"required": false,
|
|
121
|
+
"columnType": "TEXT"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "template",
|
|
125
|
+
"type": "text",
|
|
126
|
+
"required": true,
|
|
127
|
+
"columnType": "TEXT"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"name": "auto_generated",
|
|
131
|
+
"type": "boolean",
|
|
132
|
+
"required": true,
|
|
133
|
+
"columnType": "BOOLEAN"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"name": "source_hash",
|
|
137
|
+
"type": "text",
|
|
138
|
+
"required": false,
|
|
139
|
+
"columnType": "TEXT"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"name": "ai_model",
|
|
143
|
+
"type": "text",
|
|
144
|
+
"required": false,
|
|
145
|
+
"columnType": "TEXT"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"name": "reviewed_at",
|
|
149
|
+
"type": "text",
|
|
150
|
+
"required": false,
|
|
151
|
+
"columnType": "TEXT"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"name": "reviewed_by",
|
|
155
|
+
"type": "text",
|
|
156
|
+
"required": false,
|
|
157
|
+
"columnType": "TEXT"
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
"relationships": [],
|
|
161
|
+
"methods": [
|
|
162
|
+
"approve",
|
|
163
|
+
"delete",
|
|
164
|
+
"save"
|
|
165
|
+
],
|
|
166
|
+
"surfaces": [
|
|
167
|
+
{
|
|
168
|
+
"kind": "api",
|
|
169
|
+
"name": "languageoverrides.list",
|
|
170
|
+
"operation": "list",
|
|
171
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
172
|
+
"path": "/languageoverrides",
|
|
173
|
+
"method": "GET"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"kind": "api",
|
|
177
|
+
"name": "languageoverrides.get",
|
|
178
|
+
"operation": "get",
|
|
179
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
180
|
+
"path": "/languageoverrides/[id]",
|
|
181
|
+
"method": "GET"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"kind": "api",
|
|
185
|
+
"name": "languageoverrides.create",
|
|
186
|
+
"operation": "create",
|
|
187
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
188
|
+
"path": "/languageoverrides",
|
|
189
|
+
"method": "POST"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"kind": "api",
|
|
193
|
+
"name": "languageoverrides.update",
|
|
194
|
+
"operation": "update",
|
|
195
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
196
|
+
"path": "/languageoverrides/[id]",
|
|
197
|
+
"method": "PATCH"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"kind": "api",
|
|
201
|
+
"name": "languageoverrides.delete",
|
|
202
|
+
"operation": "delete",
|
|
203
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
204
|
+
"path": "/languageoverrides/[id]",
|
|
205
|
+
"method": "DELETE"
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"kind": "cli",
|
|
209
|
+
"name": "languageoverride_list",
|
|
210
|
+
"operation": "list",
|
|
211
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"kind": "cli",
|
|
215
|
+
"name": "languageoverride_get",
|
|
216
|
+
"operation": "get",
|
|
217
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"kind": "cli",
|
|
221
|
+
"name": "languageoverride_create",
|
|
222
|
+
"operation": "create",
|
|
223
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"kind": "cli",
|
|
227
|
+
"name": "languageoverride_update",
|
|
228
|
+
"operation": "update",
|
|
229
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"kind": "cli",
|
|
233
|
+
"name": "languageoverride_delete",
|
|
234
|
+
"operation": "delete",
|
|
235
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"kind": "cli",
|
|
239
|
+
"name": "languageoverride_approve",
|
|
240
|
+
"operation": "approve",
|
|
241
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
242
|
+
}
|
|
243
|
+
],
|
|
244
|
+
"relationshipFeatures": [
|
|
245
|
+
"uuidColumns"
|
|
246
|
+
],
|
|
247
|
+
"tags": [],
|
|
248
|
+
"risks": []
|
|
249
|
+
}
|
|
250
|
+
],
|
|
251
|
+
"surfaces": [
|
|
252
|
+
{
|
|
253
|
+
"kind": "api",
|
|
254
|
+
"name": "languageoverrides.list",
|
|
255
|
+
"operation": "list",
|
|
256
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
257
|
+
"path": "/languageoverrides",
|
|
258
|
+
"method": "GET"
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"kind": "api",
|
|
262
|
+
"name": "languageoverrides.get",
|
|
263
|
+
"operation": "get",
|
|
264
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
265
|
+
"path": "/languageoverrides/[id]",
|
|
266
|
+
"method": "GET"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"kind": "api",
|
|
270
|
+
"name": "languageoverrides.create",
|
|
271
|
+
"operation": "create",
|
|
272
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
273
|
+
"path": "/languageoverrides",
|
|
274
|
+
"method": "POST"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"kind": "api",
|
|
278
|
+
"name": "languageoverrides.update",
|
|
279
|
+
"operation": "update",
|
|
280
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
281
|
+
"path": "/languageoverrides/[id]",
|
|
282
|
+
"method": "PATCH"
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"kind": "api",
|
|
286
|
+
"name": "languageoverrides.delete",
|
|
287
|
+
"operation": "delete",
|
|
288
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride",
|
|
289
|
+
"path": "/languageoverrides/[id]",
|
|
290
|
+
"method": "DELETE"
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"kind": "cli",
|
|
294
|
+
"name": "languageoverride_list",
|
|
295
|
+
"operation": "list",
|
|
296
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"kind": "cli",
|
|
300
|
+
"name": "languageoverride_get",
|
|
301
|
+
"operation": "get",
|
|
302
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"kind": "cli",
|
|
306
|
+
"name": "languageoverride_create",
|
|
307
|
+
"operation": "create",
|
|
308
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"kind": "cli",
|
|
312
|
+
"name": "languageoverride_update",
|
|
313
|
+
"operation": "update",
|
|
314
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"kind": "cli",
|
|
318
|
+
"name": "languageoverride_delete",
|
|
319
|
+
"operation": "delete",
|
|
320
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"kind": "cli",
|
|
324
|
+
"name": "languageoverride_approve",
|
|
325
|
+
"operation": "approve",
|
|
326
|
+
"objectName": "@happyvertical/smrt-languages:LanguageOverride"
|
|
327
|
+
}
|
|
328
|
+
],
|
|
329
|
+
"prompts": [
|
|
330
|
+
{
|
|
331
|
+
"filePath": "src/translation-job.ts"
|
|
332
|
+
}
|
|
333
|
+
],
|
|
334
|
+
"relationshipsV2": {
|
|
335
|
+
"foreignKeyFields": 0,
|
|
336
|
+
"crossPackageRefFields": 0,
|
|
337
|
+
"junctionCollections": 0,
|
|
338
|
+
"hierarchicalObjects": 0,
|
|
339
|
+
"polymorphicAssociations": 0,
|
|
340
|
+
"uuidColumns": 3
|
|
341
|
+
},
|
|
342
|
+
"agentDoc": "# languages\n\nSMRT language string registry with file/config + tenant overrides and AI-driven\nauto-translation for missing locales.\n\n## Core pieces\n\n- `defineLanguageString({ key, locale, template })` registers a code default in\n a global process registry. Same shape as `definePrompt` but keyed by\n `(key, locale)` rather than `key` alone.\n- `resolveLanguageString(key, options)` walks the 5-layer chain (code → file\n config → app override → tenant override → runtime override) and falls back\n through the locale chain (`fr-CA` → `fr` → default) before giving up.\n- `LanguageOverride` stores app-level and tenant-level overrides in\n `_smrt_language_overrides`. `auto_generated`, `source_hash`, `ai_model`,\n `reviewed_at`, `reviewed_by` fields support the AI auto-translation pipeline\n and admin review queue.\n- `enqueueTranslationJob({ key, targetLocale })` writes a `LanguageTranslationTask`\n job into the `languages` queue with a deterministic dedup ID so concurrent\n resolver misses collapse into one job.\n\n## Locale-miss flow\n\nWhen `resolveLanguageString` cannot find an exact `(key, locale, tenantId)`:\n\n1. Walk the locale fallback chain (`buildLocaleFallbackChain`).\n2. Return the first hit — same call returns immediately with\n `source: 'fallback'`.\n3. Fire-and-forget `enqueueTranslationJob` for the missing target, scoped to\n the current tenant for glossary purposes. App-level translations are\n reusable across tenants, so the resulting `LanguageOverride` row is written\n with `tenantId: null`.\n4. Subsequent requests hit the new app-level row and resolve at the requested\n locale.\n\nThe translation job:\n\n- Honors the `smrt-languages.auto_translate` feature flag (kill switch).\n- Skips locales outside `supportedLocales` when configured.\n- Skips when `LanguageOverride` already exists with a matching `source_hash`\n (re-translation is hash-gated, never time-based).\n- Never overwrites a row with `auto_generated: false` — human edits win\n permanently.\n- Pulls the tenant's existing overrides and renders them as a glossary so\n auto-translations match tenant voice.\n\n## Conventions\n\n- Keys are namespaced by package: `users.role.member`, `commerce.invoice.dueText`.\n- Locales follow BCP-47 (`en`, `fr-CA`, `pt-BR`) and are normalized to\n lowercase-language / uppercase-region on persistence.\n- The translation prompt itself is registered with `smrt-prompts` under\n `smrt-languages.translation` so ops can tune wording without redeploying.\n- `context` column on `_smrt_language_overrides` is set to `tenantId` or\n `'__app__'` so the `(key, locale, context)` upsert key remains unique even\n with nullable `tenantId`.\n\n## Public API surface\n\n```typescript\nimport {\n defineLanguageString,\n resolveLanguageString,\n LanguageOverride,\n LanguageOverrideCollection,\n clearLanguageCache,\n} from '@happyvertical/smrt-languages';\n\ndefineLanguageString({\n key: 'users.role.member',\n locale: 'en',\n template: 'Member',\n});\n\nconst text = await resolveLanguageString('users.role.member', {\n db,\n tenantId: 'tenant-a',\n locale: 'es',\n vars: { name: 'Will' },\n});\n```\n"
|
|
343
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { SmrtClassOptions } from '@happyvertical/smrt-core';
|
|
2
|
+
|
|
3
|
+
export declare interface LanguageCacheValue {
|
|
4
|
+
key: string;
|
|
5
|
+
locale: string;
|
|
6
|
+
template: string;
|
|
7
|
+
source: ResolvedLanguageString['source'];
|
|
8
|
+
resolvedFromLocale: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export declare interface LanguageOverrideOptions {
|
|
12
|
+
key?: string;
|
|
13
|
+
locale?: string;
|
|
14
|
+
tenantId?: string | null;
|
|
15
|
+
template?: string;
|
|
16
|
+
auto_generated?: boolean;
|
|
17
|
+
source_hash?: string | null;
|
|
18
|
+
ai_model?: string | null;
|
|
19
|
+
reviewed_at?: string | null;
|
|
20
|
+
reviewed_by?: string | null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Per-package config bag, read via `getPackageConfig('languages', ...)`.
|
|
25
|
+
*
|
|
26
|
+
* `overrides[key][locale]` is a plain string template that takes precedence over
|
|
27
|
+
* code defaults for that (key, locale) pair. It is the file-config layer in the
|
|
28
|
+
* 5-layer resolution chain.
|
|
29
|
+
*/
|
|
30
|
+
export declare interface LanguagesPackageConfig {
|
|
31
|
+
/** Default locale used when none is supplied at resolve-time. Defaults to 'en'. */
|
|
32
|
+
defaultLocale?: string;
|
|
33
|
+
/** When set, AI auto-translation jobs are only enqueued for these locales. */
|
|
34
|
+
supportedLocales?: string[];
|
|
35
|
+
/** Daily cap on AI translation jobs per tenant (null = no cap). */
|
|
36
|
+
translationBudgetPerTenantPerDay?: number | null;
|
|
37
|
+
/** File-config overrides, keyed by (key)(locale). */
|
|
38
|
+
overrides?: Record<string, Record<string, string>>;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export declare interface LanguageStringDefinition {
|
|
43
|
+
key: string;
|
|
44
|
+
locale: string;
|
|
45
|
+
template: string;
|
|
46
|
+
/** sha256 of the template at registration time, used for re-translation gating */
|
|
47
|
+
sourceHash: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** A registered code default for a single (key, locale) pair. */
|
|
51
|
+
export declare interface LanguageStringDefinitionInput {
|
|
52
|
+
key: string;
|
|
53
|
+
locale: string;
|
|
54
|
+
template: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export declare type LanguageVariables = Record<string, unknown>;
|
|
58
|
+
|
|
59
|
+
export declare interface ResolvedLanguageString {
|
|
60
|
+
key: string;
|
|
61
|
+
locale: string;
|
|
62
|
+
/** The fully-rendered string with variables substituted. */
|
|
63
|
+
text: string;
|
|
64
|
+
/** The raw template that produced `text`. */
|
|
65
|
+
template: string;
|
|
66
|
+
/** Locale that actually produced the template (may differ from `locale` after fallback). */
|
|
67
|
+
resolvedFromLocale: string;
|
|
68
|
+
/**
|
|
69
|
+
* `'code' | 'config' | 'app' | 'tenant' | 'runtime'`. `'fallback'` indicates
|
|
70
|
+
* no exact match was found and a fallback locale was used.
|
|
71
|
+
*/
|
|
72
|
+
source: 'code' | 'config' | 'app' | 'tenant' | 'runtime' | 'fallback' | 'missing';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export declare interface ResolveLanguageStringOptions {
|
|
76
|
+
db?: SmrtClassOptions['db'];
|
|
77
|
+
tenantId?: string | null;
|
|
78
|
+
locale?: string;
|
|
79
|
+
/** Variables substituted into `{var}` placeholders. */
|
|
80
|
+
vars?: LanguageVariables;
|
|
81
|
+
/** Optional per-call override for the rendered template (highest precedence). */
|
|
82
|
+
overrides?: {
|
|
83
|
+
template?: string;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* When `true`, throw if the resolution chain finishes without producing a
|
|
87
|
+
* template. When `false` (default), return the key as the rendered string and
|
|
88
|
+
* enqueue an AI translation job for the missing (key, locale).
|
|
89
|
+
*/
|
|
90
|
+
strict?: boolean;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Payload pushed to the smrt-jobs translation handler. */
|
|
94
|
+
export declare interface TranslationJobPayload {
|
|
95
|
+
key: string;
|
|
96
|
+
sourceLocale: string;
|
|
97
|
+
sourceTemplate: string;
|
|
98
|
+
sourceHash: string;
|
|
99
|
+
targetLocale: string;
|
|
100
|
+
tenantId?: string | null;
|
|
101
|
+
/** Optional model override; defaults to config / @happyvertical/ai default. */
|
|
102
|
+
model?: string;
|
|
103
|
+
[key: string]: unknown;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { }
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@happyvertical/smrt-languages",
|
|
3
|
+
"version": "0.30.0",
|
|
4
|
+
"description": "Code-first language strings with config + tenant overrides and AI auto-translation for SMRT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"CLAUDE.md",
|
|
11
|
+
"AGENTS.md"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./jobs": {
|
|
19
|
+
"types": "./dist/jobs.d.ts",
|
|
20
|
+
"import": "./dist/jobs.js"
|
|
21
|
+
},
|
|
22
|
+
"./cli": {
|
|
23
|
+
"types": "./dist/cli.d.ts",
|
|
24
|
+
"import": "./dist/cli.js"
|
|
25
|
+
},
|
|
26
|
+
"./manifest": "./dist/manifest.json",
|
|
27
|
+
"./manifest.json": "./dist/manifest.json"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@happyvertical/ai": "^0.74.7",
|
|
31
|
+
"@happyvertical/logger": "^0.74.7",
|
|
32
|
+
"@happyvertical/sql": "^0.74.7",
|
|
33
|
+
"@happyvertical/smrt-config": "0.30.0",
|
|
34
|
+
"@happyvertical/smrt-core": "0.30.0",
|
|
35
|
+
"@happyvertical/smrt-features": "0.30.0",
|
|
36
|
+
"@happyvertical/smrt-jobs": "0.30.0",
|
|
37
|
+
"@happyvertical/smrt-prompts": "0.30.0",
|
|
38
|
+
"@happyvertical/smrt-tenancy": "0.30.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "24.10.9",
|
|
42
|
+
"typescript": "^5.9.3",
|
|
43
|
+
"vite": "^7.3.1",
|
|
44
|
+
"vitest": "^4.0.17",
|
|
45
|
+
"@happyvertical/smrt-vitest": "0.30.0",
|
|
46
|
+
"@happyvertical/smrt-cli": "0.30.0"
|
|
47
|
+
},
|
|
48
|
+
"keywords": [
|
|
49
|
+
"smrt",
|
|
50
|
+
"languages",
|
|
51
|
+
"i18n",
|
|
52
|
+
"translation",
|
|
53
|
+
"ai",
|
|
54
|
+
"multi-tenancy"
|
|
55
|
+
],
|
|
56
|
+
"author": "HappyVertical",
|
|
57
|
+
"license": "MIT",
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"registry": "https://registry.npmjs.org",
|
|
60
|
+
"access": "public"
|
|
61
|
+
},
|
|
62
|
+
"repository": {
|
|
63
|
+
"type": "git",
|
|
64
|
+
"url": "https://github.com/happyvertical/smrt.git",
|
|
65
|
+
"directory": "packages/languages"
|
|
66
|
+
},
|
|
67
|
+
"scripts": {
|
|
68
|
+
"build": "vite build --mode library",
|
|
69
|
+
"build:watch": "vite build --mode library --watch",
|
|
70
|
+
"clean": "rm -rf dist",
|
|
71
|
+
"dev": "vite dev",
|
|
72
|
+
"test": "vitest run",
|
|
73
|
+
"test:watch": "vitest",
|
|
74
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
75
|
+
"verify:pack": "node ../../scripts/verify-package-types-exports.js ."
|
|
76
|
+
}
|
|
77
|
+
}
|