@happyvertical/smrt-languages 0.51.32 → 0.51.34

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=__smrt-register__.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"__smrt-register__.d.ts","sourceRoot":"","sources":["../src/__smrt-register__.ts"],"names":[],"mappings":""}
@@ -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
- import { SmrtObject } from '@happyvertical/smrt-core';
3
- import { SmrtObjectOptions } from '@happyvertical/smrt-core';
4
-
5
- /** `smrt languages approve <id> --reviewer=<user>` — mark reviewed. */
6
- export declare function approveAutoTranslation(options: {
7
- db: SmrtClassOptions['db'];
8
- id: string;
9
- reviewer: string;
10
- }): Promise< LanguageOverride>;
11
-
12
- /** `smrt languages edit <id> --template=...` — human-edit suppresses auto-overwrites. */
13
- export declare function editLanguageOverride(options: {
14
- db: SmrtClassOptions['db'];
15
- id: string;
16
- template: string;
17
- reviewer?: string;
18
- }): Promise< LanguageOverride>;
19
-
20
- declare class LanguageOverride extends SmrtObject {
21
- key: string;
22
- locale: string;
23
- tenantId: string | null;
24
- template: string;
25
- /** True when this row was produced by the AI translation job. */
26
- auto_generated: boolean;
27
- /** sha256 of the source template at translation time, for re-translation gating. */
28
- source_hash: string | null;
29
- /** AI model identifier (null for human-edited rows). */
30
- ai_model: string | null;
31
- /** ISO timestamp marking admin review of an auto-generated row. */
32
- reviewed_at: string | null;
33
- /** User ID of the reviewer. */
34
- reviewed_by: string | null;
35
- constructor(options?: LanguageOverrideCtorOptions);
36
- save(): Promise<this>;
37
- private saveAfterIdentityChange;
38
- private saveAfterIdentityChangeInTransaction;
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
- import { DatabaseInterface } from '@happyvertical/sql';
2
- import { SmrtClassOptions } from '@happyvertical/smrt-core';
3
- import { SmrtCollection } from '@happyvertical/smrt-core';
4
- import { SmrtObject } from '@happyvertical/smrt-core';
5
- import { SmrtObjectOptions } from '@happyvertical/smrt-core';
6
-
7
- /**
8
- * Build the locale fallback chain for a requested locale.
9
- *
10
- * Example: `fr-CA` with default `en` → `['fr-CA', 'fr', 'en']`.
11
- * Duplicates and empty segments are removed.
12
- */
13
- export declare function buildLocaleFallbackChain(requested: string, defaultLocale: string): string[];
14
-
15
- /**
16
- * Build a glossary string suitable for inclusion in an AI translation prompt.
17
- *
18
- * Pulls the tenant's existing language overrides for the source/target locales
19
- * and renders them as a concise list of "source → target" pairs, restricted to
20
- * keys that actually have both sides. The intent is "make AI auto-translations
21
- * match tenant voice", not bulk dump every override.
22
- *
23
- * Returns an empty string when there is nothing useful to add.
24
- */
25
- export declare function buildTenantGlossary(overrides: LanguageOverride[], options: {
26
- sourceLocale: string;
27
- targetLocale: string;
28
- max?: number;
29
- }): string;
30
-
31
- /** Deterministic translation-job ID — used for stampede protection. */
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.34\",\"objects\":{\"@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: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\"}},\"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";