@happyvertical/smrt-languages 0.51.32 → 0.51.33
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/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/cache.d.ts +50 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cli.d.ts +38 -94
- package/dist/cli.d.ts.map +1 -0
- package/dist/collections/LanguageOverrideCollection.d.ts +27 -0
- package/dist/collections/LanguageOverrideCollection.d.ts.map +1 -0
- package/dist/glossary.d.ts +17 -0
- package/dist/glossary.d.ts.map +1 -0
- package/dist/index.d.ts +31 -252
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/jobs/translation-job.d.ts +45 -0
- package/dist/jobs/translation-job.d.ts.map +1 -0
- package/dist/jobs.d.ts +14 -68
- package/dist/jobs.d.ts.map +1 -0
- package/dist/language-registry.d.ts +19 -0
- package/dist/language-registry.d.ts.map +1 -0
- package/dist/language-resolver.d.ts +4 -0
- package/dist/language-resolver.d.ts.map +1 -0
- package/dist/manifest.json +89 -89
- package/dist/models/LanguageOverride.d.ts +34 -0
- package/dist/models/LanguageOverride.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +42 -42
- package/dist/types.d.ts +95 -110
- package/dist/types.d.ts.map +1 -0
- package/dist/utils.d.ts +40 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +10 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__smrt-register__.d.ts","sourceRoot":"","sources":["../src/__smrt-register__.ts"],"names":[],"mappings":""}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import type { LanguageCacheValue } from './types.js';
|
|
3
|
+
export declare function getLanguageCacheTtlMs(): number;
|
|
4
|
+
export declare function getCachedLanguage(key: string, locale: string, tenantId: string | null | undefined, db: DatabaseInterface | unknown): LanguageCacheValue | null;
|
|
5
|
+
/**
|
|
6
|
+
* Reads the current invalidation generation for a `(key, locale)` pair.
|
|
7
|
+
*
|
|
8
|
+
* A resolution captures this *before* its asynchronous layer loads and hands
|
|
9
|
+
* it back to {@link setCachedLanguage}. Any write that lands while those loads
|
|
10
|
+
* are in flight bumps the generation, so the in-flight resolution — which read
|
|
11
|
+
* the pre-write layers — is refused the cache write instead of repopulating
|
|
12
|
+
* the entry the write just invalidated. Without this, a read that raced a
|
|
13
|
+
* write served the pre-write value for the full TTL, and a raced `delete()`
|
|
14
|
+
* resurrected the deleted override.
|
|
15
|
+
*
|
|
16
|
+
* Granularity is `(db, key, locale)`, not `(db, key)` as in smrt-playbooks and
|
|
17
|
+
* smrt-prompts, and not `(db, key, locale, tenantId)`:
|
|
18
|
+
*
|
|
19
|
+
* - `locale` is part of the key because every layer a cached entry is built
|
|
20
|
+
* from is read at exactly the locale it is cached under. `resolveLanguageString`
|
|
21
|
+
* walks a fallback chain (`fr-CA` → `fr` → `en`), but each attempt reads its
|
|
22
|
+
* own locale's rows (`getTenantOverride`/`getAppOverride` are called with
|
|
23
|
+
* that locale) and caches the result under that same locale; an attempt that
|
|
24
|
+
* resolves nothing caches nothing, so a fallback hit is never stored under
|
|
25
|
+
* the requested locale. Every writer — `LanguageOverride.save()`/`delete()`
|
|
26
|
+
* (both identities, when one changes) and the translation job — invalidates
|
|
27
|
+
* the same `(key, locale)` it wrote. A per-locale generation therefore still
|
|
28
|
+
* covers every write that can change what a cached entry was built from.
|
|
29
|
+
* - `tenantId` is deliberately *not* part of the key, because an app-level row
|
|
30
|
+
* (tenantId null) is inherited by every tenant, so a write to any scope of a
|
|
31
|
+
* `(key, locale)` must be able to refuse an in-flight write for any other
|
|
32
|
+
* scope of it. This matches the coarsest fan-out of
|
|
33
|
+
* {@link invalidateLanguageCache}.
|
|
34
|
+
*
|
|
35
|
+
* A pair with no entry of its own reports the {@link clearLanguageCache} floor
|
|
36
|
+
* rather than a bare 0, so a clear refuses in-flight writes for pairs that have
|
|
37
|
+
* never been invalidated too.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getLanguageCacheGeneration(key: string, locale: string, db: DatabaseInterface | unknown): number;
|
|
40
|
+
export declare function setCachedLanguage(key: string, locale: string, tenantId: string | null | undefined, db: DatabaseInterface | unknown, value: LanguageCacheValue, loadedAtGeneration: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Drop cached entries that match the given (key, locale).
|
|
43
|
+
*
|
|
44
|
+
* - When `tenantId` is provided, only that tenant's entries for this DB are dropped.
|
|
45
|
+
* - When `tenantId` is null/undefined, every (key, locale, *) entry across tenants
|
|
46
|
+
* is dropped — used for app-level writes that affect all tenants.
|
|
47
|
+
*/
|
|
48
|
+
export declare function invalidateLanguageCache(key: string, locale: string, tenantId: string | null | undefined, db: DatabaseInterface | unknown): void;
|
|
49
|
+
export declare function clearLanguageCache(): void;
|
|
50
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8FrD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,EAAE,EAAE,iBAAiB,GAAG,OAAO,GAC9B,kBAAkB,GAAG,IAAI,CAc3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,iBAAiB,GAAG,OAAO,GAC9B,MAAM,CAIR;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,EAAE,EAAE,iBAAiB,GAAG,OAAO,EAC/B,KAAK,EAAE,kBAAkB,EACzB,kBAAkB,EAAE,MAAM,GACzB,IAAI,CAWN;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,EAAE,EAAE,iBAAiB,GAAG,OAAO,GAC9B,IAAI,CAgBN;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAQzC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,94 +1,38 @@
|
|
|
1
|
-
import { SmrtClassOptions } from '@happyvertical/smrt-core';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
declare
|
|
21
|
-
|
|
22
|
-
locale
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
private saveAfterIdentityChangeWithDeferredDelete;
|
|
40
|
-
delete(): Promise<void>;
|
|
41
|
-
/**
|
|
42
|
-
* Mark this auto-generated row as reviewed by an admin. Useful for the
|
|
43
|
-
* admin review queue surfaced via `smrt languages approve <id>`.
|
|
44
|
-
*/
|
|
45
|
-
approve(reviewerId: string): Promise<this>;
|
|
46
|
-
private getPersistedIdentity;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
declare interface LanguageOverrideCtorOptions extends SmrtObjectOptions, LanguageOverrideOptions {
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
declare interface LanguageOverrideOptions {
|
|
53
|
-
key?: string;
|
|
54
|
-
locale?: string;
|
|
55
|
-
tenantId?: string | null;
|
|
56
|
-
template?: string;
|
|
57
|
-
auto_generated?: boolean;
|
|
58
|
-
source_hash?: string | null;
|
|
59
|
-
ai_model?: string | null;
|
|
60
|
-
reviewed_at?: string | null;
|
|
61
|
-
reviewed_by?: string | null;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** `smrt languages review --locale=es` — list unreviewed auto-translations. */
|
|
65
|
-
export declare function listUnreviewedAutoTranslations(options: {
|
|
66
|
-
db: SmrtClassOptions['db'];
|
|
67
|
-
locale?: string;
|
|
68
|
-
limit?: number;
|
|
69
|
-
}): Promise< LanguageOverride[]>;
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Implementation of `smrt languages translate --locales=es,fr`.
|
|
73
|
-
*
|
|
74
|
-
* Walks the registered code defaults and enqueues a translation job for every
|
|
75
|
-
* `(key, locale)` pair that does not yet have an app-level override. The job
|
|
76
|
-
* itself respects the same dedup / budget / allowlist rules as the resolver's
|
|
77
|
-
* miss-path enqueue.
|
|
78
|
-
*/
|
|
79
|
-
export declare function translateMissing(options: {
|
|
80
|
-
locales: string[];
|
|
81
|
-
sourceLocale?: string;
|
|
82
|
-
db: SmrtClassOptions['db'];
|
|
83
|
-
tenantId?: string | null;
|
|
84
|
-
}): Promise<{
|
|
85
|
-
enqueued: string[];
|
|
86
|
-
skipped: string[];
|
|
87
|
-
}>;
|
|
88
|
-
|
|
89
|
-
export { }
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
declare global {
|
|
93
|
-
var __smrtLanguageRegistry: Map<string, Map<string, LanguageStringDefinition>> | undefined;
|
|
94
|
-
}
|
|
1
|
+
import type { SmrtClassOptions } from '@happyvertical/smrt-core';
|
|
2
|
+
/**
|
|
3
|
+
* Implementation of `smrt languages translate --locales=es,fr`.
|
|
4
|
+
*
|
|
5
|
+
* Walks the registered code defaults and enqueues a translation job for every
|
|
6
|
+
* `(key, locale)` pair that does not yet have an app-level override. The job
|
|
7
|
+
* itself respects the same dedup / budget / allowlist rules as the resolver's
|
|
8
|
+
* miss-path enqueue.
|
|
9
|
+
*/
|
|
10
|
+
export declare function translateMissing(options: {
|
|
11
|
+
locales: string[];
|
|
12
|
+
sourceLocale?: string;
|
|
13
|
+
db: SmrtClassOptions['db'];
|
|
14
|
+
tenantId?: string | null;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
enqueued: string[];
|
|
17
|
+
skipped: string[];
|
|
18
|
+
}>;
|
|
19
|
+
/** `smrt languages review --locale=es` — list unreviewed auto-translations. */
|
|
20
|
+
export declare function listUnreviewedAutoTranslations(options: {
|
|
21
|
+
db: SmrtClassOptions['db'];
|
|
22
|
+
locale?: string;
|
|
23
|
+
limit?: number;
|
|
24
|
+
}): Promise<import("./index.js").LanguageOverride[]>;
|
|
25
|
+
/** `smrt languages approve <id> --reviewer=<user>` — mark reviewed. */
|
|
26
|
+
export declare function approveAutoTranslation(options: {
|
|
27
|
+
db: SmrtClassOptions['db'];
|
|
28
|
+
id: string;
|
|
29
|
+
reviewer: string;
|
|
30
|
+
}): Promise<import("./index.js").LanguageOverride>;
|
|
31
|
+
/** `smrt languages edit <id> --template=...` — human-edit suppresses auto-overwrites. */
|
|
32
|
+
export declare function editLanguageOverride(options: {
|
|
33
|
+
db: SmrtClassOptions['db'];
|
|
34
|
+
id: string;
|
|
35
|
+
template: string;
|
|
36
|
+
reviewer?: string;
|
|
37
|
+
}): Promise<import("./index.js").LanguageOverride>;
|
|
38
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAMjE;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC,CA+CD;AAED,+EAA+E;AAC/E,wBAAsB,8BAA8B,CAAC,OAAO,EAAE;IAC5D,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,oDAQA;AAED,uEAAuE;AACvE,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,kDASA;AAED,yFAAyF;AACzF,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,kDAiBA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SmrtCollection } from '@happyvertical/smrt-core';
|
|
2
|
+
import { LanguageOverride } from '../models/LanguageOverride.js';
|
|
3
|
+
export declare class LanguageOverrideCollection extends SmrtCollection<LanguageOverride> {
|
|
4
|
+
static readonly _itemClass: typeof LanguageOverride;
|
|
5
|
+
/**
|
|
6
|
+
* Look up the app-level (tenantId = null) override for a (key, locale) pair.
|
|
7
|
+
* App-level rows hold AI auto-translations and ops-curated app-wide strings.
|
|
8
|
+
*/
|
|
9
|
+
getAppOverride(key: string, locale: string): Promise<LanguageOverride | null>;
|
|
10
|
+
getTenantOverride(key: string, locale: string, tenantId: string): Promise<LanguageOverride | null>;
|
|
11
|
+
/**
|
|
12
|
+
* Convenience helper for the resolver: returns the app and (optional) tenant
|
|
13
|
+
* override rows for a (key, locale).
|
|
14
|
+
*/
|
|
15
|
+
getResolutionLayers(key: string, locale: string, tenantId?: string | null): Promise<{
|
|
16
|
+
app: LanguageOverride | null;
|
|
17
|
+
tenant: LanguageOverride | null;
|
|
18
|
+
}>;
|
|
19
|
+
/** All overrides for a tenant (used to build the AI translation glossary). */
|
|
20
|
+
listTenantOverrides(tenantId: string): Promise<LanguageOverride[]>;
|
|
21
|
+
/** Auto-generated overrides that no admin has approved yet. */
|
|
22
|
+
listUnreviewedAutoTranslations(options?: {
|
|
23
|
+
locale?: string;
|
|
24
|
+
limit?: number;
|
|
25
|
+
}): Promise<LanguageOverride[]>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=LanguageOverrideCollection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageOverrideCollection.d.ts","sourceRoot":"","sources":["../../src/collections/LanguageOverrideCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,qBAAa,0BAA2B,SAAQ,cAAc,CAAC,gBAAgB,CAAC;IAC9E,MAAM,CAAC,QAAQ,CAAC,UAAU,0BAAoB;IAE9C;;;OAGG;IACG,cAAc,CAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAO7B,iBAAiB,CACrB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAOnC;;;OAGG;IACG,mBAAmB,CACvB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC;QACT,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;QAC7B,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;KACjC,CAAC;IAUF,8EAA8E;IACxE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIxE,+DAA+D;IACzD,8BAA8B,CAClC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAChD,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAc/B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { LanguageOverride } from './models/LanguageOverride.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a glossary string suitable for inclusion in an AI translation prompt.
|
|
4
|
+
*
|
|
5
|
+
* Pulls the tenant's existing language overrides for the source/target locales
|
|
6
|
+
* and renders them as a concise list of "source → target" pairs, restricted to
|
|
7
|
+
* keys that actually have both sides. The intent is "make AI auto-translations
|
|
8
|
+
* match tenant voice", not bulk dump every override.
|
|
9
|
+
*
|
|
10
|
+
* Returns an empty string when there is nothing useful to add.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildTenantGlossary(overrides: LanguageOverride[], options: {
|
|
13
|
+
sourceLocale: string;
|
|
14
|
+
targetLocale: string;
|
|
15
|
+
max?: number;
|
|
16
|
+
}): string;
|
|
17
|
+
//# sourceMappingURL=glossary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossary.d.ts","sourceRoot":"","sources":["../src/glossary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGrE;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,gBAAgB,EAAE,EAC7B,OAAO,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,MAAM,CA4BR"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,252 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
export declare function buildTranslationJobId(key: string, targetLocale: string): string;
|
|
33
|
-
|
|
34
|
-
export declare function clearLanguageCache(): void;
|
|
35
|
-
|
|
36
|
-
/** Stable hash used to gate auto-translation re-runs against a specific source. */
|
|
37
|
-
export declare function computeSourceHash(template: string): string;
|
|
38
|
-
|
|
39
|
-
export declare function defineLanguageString(input: LanguageStringDefinitionInput): LanguageStringDefinition;
|
|
40
|
-
|
|
41
|
-
export declare function getLanguageCacheTtlMs(): number;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Drop cached entries that match the given (key, locale).
|
|
45
|
-
*
|
|
46
|
-
* - When `tenantId` is provided, only that tenant's entries for this DB are dropped.
|
|
47
|
-
* - When `tenantId` is null/undefined, every (key, locale, *) entry across tenants
|
|
48
|
-
* is dropped — used for app-level writes that affect all tenants.
|
|
49
|
-
*/
|
|
50
|
-
export declare function invalidateLanguageCache(key: string, locale: string, tenantId: string | null | undefined, db: DatabaseInterface | unknown): void;
|
|
51
|
-
|
|
52
|
-
export declare function invalidateResolvedLanguageCache(key: string, locale: string, tenantId: string | null | undefined, db: unknown): void;
|
|
53
|
-
|
|
54
|
-
export declare interface LanguageCacheValue {
|
|
55
|
-
key: string;
|
|
56
|
-
locale: string;
|
|
57
|
-
template: string;
|
|
58
|
-
source: ResolvedLanguageString['source'];
|
|
59
|
-
resolvedFromLocale: string;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export declare class LanguageOverride extends SmrtObject {
|
|
63
|
-
key: string;
|
|
64
|
-
locale: string;
|
|
65
|
-
tenantId: string | null;
|
|
66
|
-
template: string;
|
|
67
|
-
/** True when this row was produced by the AI translation job. */
|
|
68
|
-
auto_generated: boolean;
|
|
69
|
-
/** sha256 of the source template at translation time, for re-translation gating. */
|
|
70
|
-
source_hash: string | null;
|
|
71
|
-
/** AI model identifier (null for human-edited rows). */
|
|
72
|
-
ai_model: string | null;
|
|
73
|
-
/** ISO timestamp marking admin review of an auto-generated row. */
|
|
74
|
-
reviewed_at: string | null;
|
|
75
|
-
/** User ID of the reviewer. */
|
|
76
|
-
reviewed_by: string | null;
|
|
77
|
-
constructor(options?: LanguageOverrideCtorOptions);
|
|
78
|
-
save(): Promise<this>;
|
|
79
|
-
private saveAfterIdentityChange;
|
|
80
|
-
private saveAfterIdentityChangeInTransaction;
|
|
81
|
-
private saveAfterIdentityChangeWithDeferredDelete;
|
|
82
|
-
delete(): Promise<void>;
|
|
83
|
-
/**
|
|
84
|
-
* Mark this auto-generated row as reviewed by an admin. Useful for the
|
|
85
|
-
* admin review queue surfaced via `smrt languages approve <id>`.
|
|
86
|
-
*/
|
|
87
|
-
approve(reviewerId: string): Promise<this>;
|
|
88
|
-
private getPersistedIdentity;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export declare class LanguageOverrideCollection extends SmrtCollection<LanguageOverride> {
|
|
92
|
-
static readonly _itemClass: typeof LanguageOverride;
|
|
93
|
-
/**
|
|
94
|
-
* Look up the app-level (tenantId = null) override for a (key, locale) pair.
|
|
95
|
-
* App-level rows hold AI auto-translations and ops-curated app-wide strings.
|
|
96
|
-
*/
|
|
97
|
-
getAppOverride(key: string, locale: string): Promise<LanguageOverride | null>;
|
|
98
|
-
getTenantOverride(key: string, locale: string, tenantId: string): Promise<LanguageOverride | null>;
|
|
99
|
-
/**
|
|
100
|
-
* Convenience helper for the resolver: returns the app and (optional) tenant
|
|
101
|
-
* override rows for a (key, locale).
|
|
102
|
-
*/
|
|
103
|
-
getResolutionLayers(key: string, locale: string, tenantId?: string | null): Promise<{
|
|
104
|
-
app: LanguageOverride | null;
|
|
105
|
-
tenant: LanguageOverride | null;
|
|
106
|
-
}>;
|
|
107
|
-
/** All overrides for a tenant (used to build the AI translation glossary). */
|
|
108
|
-
listTenantOverrides(tenantId: string): Promise<LanguageOverride[]>;
|
|
109
|
-
/** Auto-generated overrides that no admin has approved yet. */
|
|
110
|
-
listUnreviewedAutoTranslations(options?: {
|
|
111
|
-
locale?: string;
|
|
112
|
-
limit?: number;
|
|
113
|
-
}): Promise<LanguageOverride[]>;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export declare interface LanguageOverrideCtorOptions extends SmrtObjectOptions, LanguageOverrideOptions {
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export declare interface LanguageOverrideOptions {
|
|
120
|
-
key?: string;
|
|
121
|
-
locale?: string;
|
|
122
|
-
tenantId?: string | null;
|
|
123
|
-
template?: string;
|
|
124
|
-
auto_generated?: boolean;
|
|
125
|
-
source_hash?: string | null;
|
|
126
|
-
ai_model?: string | null;
|
|
127
|
-
reviewed_at?: string | null;
|
|
128
|
-
reviewed_by?: string | null;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export declare const LanguageRegistry: {
|
|
132
|
-
register(input: LanguageStringDefinitionInput): LanguageStringDefinition;
|
|
133
|
-
get(key: string, locale: string): LanguageStringDefinition | undefined;
|
|
134
|
-
has(key: string, locale: string): boolean;
|
|
135
|
-
hasKey(key: string): boolean;
|
|
136
|
-
/** Return the locales that have a registered code default for the given key. */
|
|
137
|
-
getLocalesForKey(key: string): string[];
|
|
138
|
-
/** All registered (key, locale, template) triples. Used by the batch translator. */
|
|
139
|
-
getAll(): LanguageStringDefinition[];
|
|
140
|
-
/** Distinct keys currently registered. */
|
|
141
|
-
getKeys(): string[];
|
|
142
|
-
clear(): void;
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Per-package config bag, read via `getPackageConfig('languages', ...)`.
|
|
147
|
-
*
|
|
148
|
-
* `overrides[key][locale]` is a plain string template that takes precedence over
|
|
149
|
-
* code defaults for that (key, locale) pair. It is the file-config layer in the
|
|
150
|
-
* 5-layer resolution chain.
|
|
151
|
-
*/
|
|
152
|
-
export declare interface LanguagesPackageConfig {
|
|
153
|
-
/** Default locale used when none is supplied at resolve-time. Defaults to 'en'. */
|
|
154
|
-
defaultLocale?: string;
|
|
155
|
-
/** When set, AI auto-translation jobs are only enqueued for these locales. */
|
|
156
|
-
supportedLocales?: string[];
|
|
157
|
-
/** Daily cap on AI translation jobs per tenant (null = no cap). */
|
|
158
|
-
translationBudgetPerTenantPerDay?: number | null;
|
|
159
|
-
/** File-config overrides, keyed by (key)(locale). */
|
|
160
|
-
overrides?: Record<string, Record<string, string>>;
|
|
161
|
-
[key: string]: unknown;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export declare interface LanguageStringDefinition {
|
|
165
|
-
key: string;
|
|
166
|
-
locale: string;
|
|
167
|
-
template: string;
|
|
168
|
-
/** sha256 of the template at registration time, used for re-translation gating */
|
|
169
|
-
sourceHash: string;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/** A registered code default for a single (key, locale) pair. */
|
|
173
|
-
export declare interface LanguageStringDefinitionInput {
|
|
174
|
-
key: string;
|
|
175
|
-
locale: string;
|
|
176
|
-
template: string;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
export declare type LanguageVariables = Record<string, unknown>;
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Normalize a BCP-47-ish locale tag for consistent matching across the
|
|
183
|
-
* registry, the cache, and DB lookups.
|
|
184
|
-
*
|
|
185
|
-
* Lowercases the language subtag and uppercases everything after it so
|
|
186
|
-
* `fr-ca`, `fr-CA`, and `Fr-Ca` collapse to the same key. This is **not**
|
|
187
|
-
* canonical BCP-47 casing (proper BCP-47 lower-cases variants and uses
|
|
188
|
-
* Title-case for script subtags like `Hans`); it is an internal
|
|
189
|
-
* normalization shared by every layer in this package and intentionally
|
|
190
|
-
* stricter than what BCP-47 mandates.
|
|
191
|
-
*/
|
|
192
|
-
export declare function normalizeLocale(locale: string): string;
|
|
193
|
-
|
|
194
|
-
/* Excluded from this release type: PACKAGE_VERSION_INITIALIZED */
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Render `{var}` placeholders against the supplied variables.
|
|
198
|
-
*
|
|
199
|
-
* When at least one variable is provided, every `{...}` placeholder in the
|
|
200
|
-
* template is replaced; missing or `undefined`/`null` variables collapse to
|
|
201
|
-
* empty strings (callers that pass `name` but not `title` get the `{title}`
|
|
202
|
-
* placeholder removed).
|
|
203
|
-
*
|
|
204
|
-
* When `variables` is `undefined` or `{}` the template is returned unchanged
|
|
205
|
-
* — that fast path avoids the regex pass for the common "no interpolation
|
|
206
|
-
* needed" case. If you need every placeholder collapsed regardless, pass at
|
|
207
|
-
* least one variable (e.g. `{ __forceRender: true }`).
|
|
208
|
-
*/
|
|
209
|
-
export declare function renderTemplate(template: string, variables?: LanguageVariables): string;
|
|
210
|
-
|
|
211
|
-
export declare interface ResolvedLanguageString {
|
|
212
|
-
key: string;
|
|
213
|
-
locale: string;
|
|
214
|
-
/** The fully-rendered string with variables substituted. */
|
|
215
|
-
text: string;
|
|
216
|
-
/** The raw template that produced `text`. */
|
|
217
|
-
template: string;
|
|
218
|
-
/** Locale that actually produced the template (may differ from `locale` after fallback). */
|
|
219
|
-
resolvedFromLocale: string;
|
|
220
|
-
/**
|
|
221
|
-
* `'code' | 'config' | 'app' | 'tenant' | 'runtime'`. `'fallback'` indicates
|
|
222
|
-
* no exact match was found and a fallback locale was used.
|
|
223
|
-
*/
|
|
224
|
-
source: 'code' | 'config' | 'app' | 'tenant' | 'runtime' | 'fallback' | 'missing';
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export declare function resolveLanguageString(key: string, options?: ResolveLanguageStringOptions): Promise<ResolvedLanguageString>;
|
|
228
|
-
|
|
229
|
-
export declare interface ResolveLanguageStringOptions {
|
|
230
|
-
db?: SmrtClassOptions['db'];
|
|
231
|
-
tenantId?: string | null;
|
|
232
|
-
locale?: string;
|
|
233
|
-
/** Variables substituted into `{var}` placeholders. */
|
|
234
|
-
vars?: LanguageVariables;
|
|
235
|
-
/** Optional per-call override for the rendered template (highest precedence). */
|
|
236
|
-
overrides?: {
|
|
237
|
-
template?: string;
|
|
238
|
-
};
|
|
239
|
-
/**
|
|
240
|
-
* When `true`, throw if the resolution chain finishes without producing a
|
|
241
|
-
* template. When `false` (default), return the key as the rendered string and
|
|
242
|
-
* enqueue an AI translation job for the missing (key, locale).
|
|
243
|
-
*/
|
|
244
|
-
strict?: boolean;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
export { }
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
declare global {
|
|
251
|
-
var __smrtLanguageRegistry: Map<string, Map<string, LanguageStringDefinition>> | undefined;
|
|
252
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @happyvertical/smrt-languages
|
|
3
|
+
*
|
|
4
|
+
* Code-first language strings with config + tenant overrides and AI-driven
|
|
5
|
+
* auto-translation for SMRT applications. Mirrors the architecture of
|
|
6
|
+
* `@happyvertical/smrt-prompts` plus a smrt-jobs handler that fills gaps in
|
|
7
|
+
* non-default locales the first time a string is requested.
|
|
8
|
+
*
|
|
9
|
+
* The package root intentionally exposes only the read path
|
|
10
|
+
* (`defineLanguageString`, `resolveLanguageString`, `LanguageOverride`, the
|
|
11
|
+
* cache helpers, glossary helpers, and shared types/utilities). The
|
|
12
|
+
* translation-worker stack — which depends on `@happyvertical/ai`,
|
|
13
|
+
* smrt-jobs, smrt-features, and smrt-prompts — lives on the
|
|
14
|
+
* `@happyvertical/smrt-languages/jobs` subpath, and the admin CLI helpers
|
|
15
|
+
* live on `@happyvertical/smrt-languages/cli`. Resolver consumers (the vast
|
|
16
|
+
* majority of call sites) never load the worker dependency tree.
|
|
17
|
+
*
|
|
18
|
+
* @packageDocumentation
|
|
19
|
+
*/
|
|
20
|
+
import './__smrt-register__.js';
|
|
21
|
+
export { clearLanguageCache, getLanguageCacheTtlMs, invalidateLanguageCache, } from './cache.js';
|
|
22
|
+
export { LanguageOverrideCollection } from './collections/LanguageOverrideCollection.js';
|
|
23
|
+
export { buildTenantGlossary } from './glossary.js';
|
|
24
|
+
export { defineLanguageString, LanguageRegistry, } from './language-registry.js';
|
|
25
|
+
export { invalidateResolvedLanguageCache, resolveLanguageString, } from './language-resolver.js';
|
|
26
|
+
export { LanguageOverride, type LanguageOverrideCtorOptions, } from './models/LanguageOverride.js';
|
|
27
|
+
export type { LanguageCacheValue, LanguageOverrideOptions, LanguageStringDefinition, LanguageStringDefinitionInput, LanguagesPackageConfig, LanguageVariables, ResolvedLanguageString, ResolveLanguageStringOptions, } from './types.js';
|
|
28
|
+
export { buildLocaleFallbackChain, buildTranslationJobId, computeSourceHash, normalizeLocale, renderTemplate, } from './utils.js';
|
|
29
|
+
/** @internal */
|
|
30
|
+
export declare const PACKAGE_VERSION_INITIALIZED = true;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,wBAAwB,CAAC;AAEhC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,gBAAgB,EAChB,KAAK,2BAA2B,GACjC,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,gBAAgB;AAChB,eAAO,MAAM,2BAA2B,OAAO,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { ObjectRegistry } from "@happyvertical/smrt-core";
|
|
|
3
3
|
import { getPackageConfig } from "@happyvertical/smrt-config";
|
|
4
4
|
import { getTenantId } from "@happyvertical/smrt-tenancy";
|
|
5
5
|
//#region src/__smrt-register__.ts
|
|
6
|
-
ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":0,\"packageName\":\"@happyvertical/smrt-languages\",\"packageVersion\":\"0.51.32\",\"objects\":{\"@happyvertical/smrt-languages:LanguageOverrideCollection\":{\"name\":\"languageoverridecollection\",\"className\":\"LanguageOverrideCollection\",\"qualifiedName\":\"@happyvertical/smrt-languages:LanguageOverrideCollection\",\"collection\":\"languageoverrides\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/languages/src/collections/LanguageOverrideCollection.ts\",\"packageName\":\"@happyvertical/smrt-languages\",\"fields\":{},\"methods\":{\"getAppOverride\":{\"name\":\"getAppOverride\",\"async\":true,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"locale\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<LanguageOverride | null>\",\"isStatic\":false,\"isPublic\":true},\"getTenantOverride\":{\"name\":\"getTenantOverride\",\"async\":true,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"locale\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<LanguageOverride | null>\",\"isStatic\":false,\"isPublic\":true},\"getResolutionLayers\":{\"name\":\"getResolutionLayers\",\"async\":true,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"locale\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string | null\",\"optional\":true,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"null\"}]}],\"returnType\":\"Promise<object>\",\"isStatic\":false,\"isPublic\":true},\"listTenantOverrides\":{\"name\":\"listTenantOverrides\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<LanguageOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"listUnreviewedAutoTranslations\":{\"name\":\"listUnreviewedAutoTranslations\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"string\",\"number\"]}],\"returnType\":\"Promise<LanguageOverride[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_language_overrides\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"LanguageOverride\",\"exportName\":\"LanguageOverrideCollection\",\"collectionExportName\":\"LanguageOverrideCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_language_overrides\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_language_overrides\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"key\\\" TEXT NOT NULL DEFAULT '',\\n \\\"locale\\\" TEXT NOT NULL DEFAULT '',\\n \\\"tenant_id\\\" TEXT,\\n \\\"template\\\" TEXT NOT NULL,\\n \\\"auto_generated\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"source_hash\\\" TEXT,\\n \\\"ai_model\\\" TEXT,\\n \\\"reviewed_at\\\" TEXT,\\n \\\"reviewed_by\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"locale\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"tenant_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"template\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"auto_generated\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"source_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"ai_model\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"reviewed_at\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"reviewed_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_language_overrides_key_locale_idx\",\"columns\":[\"key\",\"locale\",\"context\"],\"unique\":true},{\"name\":\"_smrt_language_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"_smrt_language_overrides_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"4bef8abc\"},\"importPath\":\"@happyvertical/smrt-languages\"},\"@happyvertical/smrt-languages:LanguageTranslationTask\":{\"name\":\"languagetranslationtask\",\"className\":\"LanguageTranslationTask\",\"qualifiedName\":\"@happyvertical/smrt-languages:LanguageTranslationTask\",\"collection\":\"languagetranslationtasks\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/languages/src/jobs/translation-job.ts\",\"packageName\":\"@happyvertical/smrt-languages\",\"fields\":{},\"methods\":{\"execute\":{\"name\":\"execute\",\"async\":true,\"parameters\":[{\"name\":\"args\",\"type\":\"TranslationJobPayload\",\"optional\":false}],\"returnType\":\"Promise<object>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[]},\"cli\":{\"include\":[]},\"mcp\":{\"include\":[]}},\"extends\":\"SmrtObject\",\"exportName\":\"LanguageTranslationTask\",\"collectionExportName\":\"LanguageTranslationTaskCollection\",\"schema\":{\"tableName\":\"language_translation_tasks\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"language_translation_tasks\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"language_translation_tasks_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"language_translation_tasks_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"2cfc8812\"},\"importPath\":\"@happyvertical/smrt-languages/jobs\"},\"@happyvertical/smrt-languages:LanguageOverride\":{\"name\":\"languageoverride\",\"className\":\"LanguageOverride\",\"qualifiedName\":\"@happyvertical/smrt-languages:LanguageOverride\",\"collection\":\"languageoverrides\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/languages/src/models/LanguageOverride.ts\",\"packageName\":\"@happyvertical/smrt-languages\",\"fields\":{\"key\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true}},\"locale\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true}},\"tenantId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"template\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"auto_generated\":{\"type\":\"boolean\",\"required\":true,\"default\":false,\"_meta\":{\"required\":true,\"default\":false}},\"source_hash\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"ai_model\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"reviewed_at\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"reviewed_by\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<this>\",\"isStatic\":false,\"isPublic\":true},\"delete\":{\"name\":\"delete\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"approve\":{\"name\":\"approve\",\"async\":true,\"parameters\":[{\"name\":\"reviewerId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<this>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_language_overrides\",\"conflictColumns\":[\"key\",\"locale\",\"context\"],\"api\":{\"include\":[\"list\",\"get\",\"create\",\"update\",\"delete\"]},\"cli\":{\"include\":[\"list\",\"get\",\"create\",\"update\",\"delete\",\"approve\"],\"skipApiCheck\":true},\"mcp\":{\"include\":[]}},\"extends\":\"SmrtObject\",\"exportName\":\"LanguageOverride\",\"collectionExportName\":\"LanguageOverrideCollection\",\"validationRules\":[{\"field\":\"key\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"locale\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"template\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"auto_generated\",\"rule\":\"required\",\"fieldType\":\"boolean\"}],\"schema\":{\"tableName\":\"_smrt_language_overrides\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_language_overrides\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"key\\\" TEXT NOT NULL DEFAULT '',\\n \\\"locale\\\" TEXT NOT NULL DEFAULT '',\\n \\\"tenant_id\\\" TEXT,\\n \\\"template\\\" TEXT NOT NULL,\\n \\\"auto_generated\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"source_hash\\\" TEXT,\\n \\\"ai_model\\\" TEXT,\\n \\\"reviewed_at\\\" TEXT,\\n \\\"reviewed_by\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"locale\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"tenant_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"template\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"auto_generated\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"source_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"ai_model\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"reviewed_at\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"reviewed_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_language_overrides_key_locale_idx\",\"columns\":[\"key\",\"locale\",\"context\"],\"unique\":true},{\"name\":\"_smrt_language_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"_smrt_language_overrides_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"4bef8abc\"},\"importPath\":\"@happyvertical/smrt-languages\"}},\"moduleType\":\"smrt\",\"smrtDependencies\":[\"@happyvertical/smrt-core\",\"@happyvertical/smrt-features\",\"@happyvertical/smrt-jobs\",\"@happyvertical/smrt-prompts\",\"@happyvertical/smrt-tenancy\"]}"));
|
|
6
|
+
ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":0,\"packageName\":\"@happyvertical/smrt-languages\",\"packageVersion\":\"0.51.33\",\"objects\":{\"@happyvertical/smrt-languages:LanguageOverrideCollection\":{\"name\":\"languageoverridecollection\",\"className\":\"LanguageOverrideCollection\",\"qualifiedName\":\"@happyvertical/smrt-languages:LanguageOverrideCollection\",\"collection\":\"languageoverrides\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/languages/src/collections/LanguageOverrideCollection.ts\",\"packageName\":\"@happyvertical/smrt-languages\",\"fields\":{},\"methods\":{\"getAppOverride\":{\"name\":\"getAppOverride\",\"async\":true,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"locale\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<LanguageOverride | null>\",\"isStatic\":false,\"isPublic\":true},\"getTenantOverride\":{\"name\":\"getTenantOverride\",\"async\":true,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"locale\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<LanguageOverride | null>\",\"isStatic\":false,\"isPublic\":true},\"getResolutionLayers\":{\"name\":\"getResolutionLayers\",\"async\":true,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"locale\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string | null\",\"optional\":true,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"null\"}]}],\"returnType\":\"Promise<object>\",\"isStatic\":false,\"isPublic\":true},\"listTenantOverrides\":{\"name\":\"listTenantOverrides\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<LanguageOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"listUnreviewedAutoTranslations\":{\"name\":\"listUnreviewedAutoTranslations\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"string\",\"number\"]}],\"returnType\":\"Promise<LanguageOverride[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_language_overrides\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"LanguageOverride\",\"exportName\":\"LanguageOverrideCollection\",\"collectionExportName\":\"LanguageOverrideCollectionCollection\",\"schema\":{\"tableName\":\"_smrt_language_overrides\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_language_overrides\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"key\\\" TEXT NOT NULL DEFAULT '',\\n \\\"locale\\\" TEXT NOT NULL DEFAULT '',\\n \\\"tenant_id\\\" TEXT,\\n \\\"template\\\" TEXT NOT NULL,\\n \\\"auto_generated\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"source_hash\\\" TEXT,\\n \\\"ai_model\\\" TEXT,\\n \\\"reviewed_at\\\" TEXT,\\n \\\"reviewed_by\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"locale\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"tenant_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"template\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"auto_generated\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"source_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"ai_model\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"reviewed_at\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"reviewed_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_language_overrides_key_locale_idx\",\"columns\":[\"key\",\"locale\",\"context\"],\"unique\":true},{\"name\":\"_smrt_language_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"_smrt_language_overrides_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"4bef8abc\"},\"importPath\":\"@happyvertical/smrt-languages\"},\"@happyvertical/smrt-languages:LanguageOverride\":{\"name\":\"languageoverride\",\"className\":\"LanguageOverride\",\"qualifiedName\":\"@happyvertical/smrt-languages:LanguageOverride\",\"collection\":\"languageoverrides\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/languages/src/models/LanguageOverride.ts\",\"packageName\":\"@happyvertical/smrt-languages\",\"fields\":{\"key\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true}},\"locale\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true}},\"tenantId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"template\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"auto_generated\":{\"type\":\"boolean\",\"required\":true,\"default\":false,\"_meta\":{\"required\":true,\"default\":false}},\"source_hash\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"ai_model\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"reviewed_at\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"reviewed_by\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<this>\",\"isStatic\":false,\"isPublic\":true},\"delete\":{\"name\":\"delete\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"approve\":{\"name\":\"approve\",\"async\":true,\"parameters\":[{\"name\":\"reviewerId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<this>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"_smrt_language_overrides\",\"conflictColumns\":[\"key\",\"locale\",\"context\"],\"api\":{\"include\":[\"list\",\"get\",\"create\",\"update\",\"delete\"]},\"cli\":{\"include\":[\"list\",\"get\",\"create\",\"update\",\"delete\",\"approve\"],\"skipApiCheck\":true},\"mcp\":{\"include\":[]}},\"extends\":\"SmrtObject\",\"exportName\":\"LanguageOverride\",\"collectionExportName\":\"LanguageOverrideCollection\",\"validationRules\":[{\"field\":\"key\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"locale\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"template\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"auto_generated\",\"rule\":\"required\",\"fieldType\":\"boolean\"}],\"schema\":{\"tableName\":\"_smrt_language_overrides\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"_smrt_language_overrides\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"key\\\" TEXT NOT NULL DEFAULT '',\\n \\\"locale\\\" TEXT NOT NULL DEFAULT '',\\n \\\"tenant_id\\\" TEXT,\\n \\\"template\\\" TEXT NOT NULL,\\n \\\"auto_generated\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"source_hash\\\" TEXT,\\n \\\"ai_model\\\" TEXT,\\n \\\"reviewed_at\\\" TEXT,\\n \\\"reviewed_by\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"locale\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"tenant_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"template\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"auto_generated\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"source_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"ai_model\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"reviewed_at\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"reviewed_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"_smrt_language_overrides_key_locale_idx\",\"columns\":[\"key\",\"locale\",\"context\"],\"unique\":true},{\"name\":\"_smrt_language_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"_smrt_language_overrides_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"4bef8abc\"},\"importPath\":\"@happyvertical/smrt-languages\"},\"@happyvertical/smrt-languages:LanguageTranslationTask\":{\"name\":\"languagetranslationtask\",\"className\":\"LanguageTranslationTask\",\"qualifiedName\":\"@happyvertical/smrt-languages:LanguageTranslationTask\",\"collection\":\"languagetranslationtasks\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/languages/src/jobs/translation-job.ts\",\"packageName\":\"@happyvertical/smrt-languages\",\"fields\":{},\"methods\":{\"execute\":{\"name\":\"execute\",\"async\":true,\"parameters\":[{\"name\":\"args\",\"type\":\"TranslationJobPayload\",\"optional\":false}],\"returnType\":\"Promise<object>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[]},\"cli\":{\"include\":[]},\"mcp\":{\"include\":[]}},\"extends\":\"SmrtObject\",\"exportName\":\"LanguageTranslationTask\",\"collectionExportName\":\"LanguageTranslationTaskCollection\",\"schema\":{\"tableName\":\"language_translation_tasks\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"language_translation_tasks\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"language_translation_tasks_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"language_translation_tasks_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"2cfc8812\"},\"importPath\":\"@happyvertical/smrt-languages/jobs\"}},\"moduleType\":\"smrt\",\"smrtDependencies\":[\"@happyvertical/smrt-core\",\"@happyvertical/smrt-features\",\"@happyvertical/smrt-jobs\",\"@happyvertical/smrt-prompts\",\"@happyvertical/smrt-tenancy\"]}"));
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/language-resolver.ts
|
|
9
9
|
var DEFAULT_LOCALE = "en";
|