@actuate-media/cms-core 0.42.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/__tests__/ai/ai.test.d.ts +2 -0
  2. package/dist/__tests__/ai/ai.test.d.ts.map +1 -0
  3. package/dist/__tests__/ai/ai.test.js +261 -0
  4. package/dist/__tests__/ai/ai.test.js.map +1 -0
  5. package/dist/ai/catalog.d.ts +29 -0
  6. package/dist/ai/catalog.d.ts.map +1 -0
  7. package/dist/ai/catalog.js +340 -0
  8. package/dist/ai/catalog.js.map +1 -0
  9. package/dist/ai/config-store.d.ts +55 -0
  10. package/dist/ai/config-store.d.ts.map +1 -0
  11. package/dist/ai/config-store.js +177 -0
  12. package/dist/ai/config-store.js.map +1 -0
  13. package/dist/ai/feature-defaults.d.ts +20 -0
  14. package/dist/ai/feature-defaults.d.ts.map +1 -0
  15. package/dist/ai/feature-defaults.js +104 -0
  16. package/dist/ai/feature-defaults.js.map +1 -0
  17. package/dist/ai/index.d.ts +13 -0
  18. package/dist/ai/index.d.ts.map +1 -0
  19. package/dist/ai/index.js +13 -0
  20. package/dist/ai/index.js.map +1 -0
  21. package/dist/ai/models.d.ts +37 -0
  22. package/dist/ai/models.d.ts.map +1 -0
  23. package/dist/ai/models.js +126 -0
  24. package/dist/ai/models.js.map +1 -0
  25. package/dist/ai/providers/anthropic.d.ts +9 -0
  26. package/dist/ai/providers/anthropic.d.ts.map +1 -0
  27. package/dist/ai/providers/anthropic.js +36 -0
  28. package/dist/ai/providers/anthropic.js.map +1 -0
  29. package/dist/ai/providers/custom.d.ts +11 -0
  30. package/dist/ai/providers/custom.d.ts.map +1 -0
  31. package/dist/ai/providers/custom.js +70 -0
  32. package/dist/ai/providers/custom.js.map +1 -0
  33. package/dist/ai/providers/http.d.ts +32 -0
  34. package/dist/ai/providers/http.d.ts.map +1 -0
  35. package/dist/ai/providers/http.js +90 -0
  36. package/dist/ai/providers/http.js.map +1 -0
  37. package/dist/ai/providers/index.d.ts +16 -0
  38. package/dist/ai/providers/index.d.ts.map +1 -0
  39. package/dist/ai/providers/index.js +25 -0
  40. package/dist/ai/providers/index.js.map +1 -0
  41. package/dist/ai/providers/openai.d.ts +10 -0
  42. package/dist/ai/providers/openai.d.ts.map +1 -0
  43. package/dist/ai/providers/openai.js +41 -0
  44. package/dist/ai/providers/openai.js.map +1 -0
  45. package/dist/ai/providers/xai.d.ts +9 -0
  46. package/dist/ai/providers/xai.d.ts.map +1 -0
  47. package/dist/ai/providers/xai.js +35 -0
  48. package/dist/ai/providers/xai.js.map +1 -0
  49. package/dist/ai/types.d.ts +161 -0
  50. package/dist/ai/types.d.ts.map +1 -0
  51. package/dist/ai/types.js +11 -0
  52. package/dist/ai/types.js.map +1 -0
  53. package/dist/ai/usage.d.ts +18 -0
  54. package/dist/ai/usage.d.ts.map +1 -0
  55. package/dist/ai/usage.js +70 -0
  56. package/dist/ai/usage.js.map +1 -0
  57. package/dist/api/handlers.d.ts.map +1 -1
  58. package/dist/api/handlers.js +477 -0
  59. package/dist/api/handlers.js.map +1 -1
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +4 -0
  63. package/dist/index.js.map +1 -1
  64. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/ai/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * DB-backed AI configuration store.
3
+ *
4
+ * Storage: a single Document row with `collection = '__ai_config__'` holding
5
+ * `{ providers, settings, catalog }`, mirroring the SEO config-store pattern
6
+ * (`packages/cms-core/src/seo/config-store.ts`). This keeps Phases 1-2 free of a
7
+ * Prisma migration. The per-run usage table arrives in Phase 4.
8
+ *
9
+ * Security invariants:
10
+ * - Provider API keys are encrypted at rest via `encryptSecret`.
11
+ * - The encrypted key is NEVER returned to the client; handlers serialize
12
+ * providers through {@link toPublicProvider}.
13
+ * - When a provider's env var is set, that key wins and the UI shows it as
14
+ * env-managed/read-only.
15
+ */
16
+ import type { AIBudgetSettings, AIConfigDocument, AIKeySource, AIProviderConnection, AIProviderConnectionPublic, AIProviderKey, AISettings } from './types.js';
17
+ export declare const AI_CONFIG_COLLECTION = "__ai_config__";
18
+ export declare const DEFAULT_AI_BUDGET: AIBudgetSettings;
19
+ export declare function defaultAISettings(): AISettings;
20
+ /** Read the env-managed key for a provider, if present and non-empty. */
21
+ export declare function getEnvApiKey(provider: AIProviderKey): string | null;
22
+ /** Last 4 chars of a key for masked display (never the full value). */
23
+ export declare function last4(key: string | undefined | null): string | undefined;
24
+ /**
25
+ * Resolve the effective API key for a connection at call time: an env var (if
26
+ * configured for this provider) always wins, otherwise the decrypted stored key.
27
+ * Returns null when neither exists.
28
+ */
29
+ export declare function resolveProviderKey(conn: Pick<AIProviderConnection, 'provider' | 'apiKeyEncrypted'>): Promise<string | null>;
30
+ /** Determine where a connection's key comes from for UI display. */
31
+ export declare function resolveKeySource(conn: AIProviderConnection): AIKeySource;
32
+ /** Strip key material and add UI-facing source metadata. */
33
+ export declare function toPublicProvider(conn: AIProviderConnection): AIProviderConnectionPublic;
34
+ /** Encrypt a plaintext key for storage and compute its masked suffix. */
35
+ export declare function encryptProviderKey(plaintext: string): Promise<{
36
+ apiKeyEncrypted: string;
37
+ apiKeyLast4: string;
38
+ }>;
39
+ /**
40
+ * Read the AI config document. Returns a fully-populated object (defaults +
41
+ * merged feature flags) even when no row exists yet, so callers never special-
42
+ * case the empty state.
43
+ */
44
+ export declare function getAIConfig(db: unknown): Promise<AIConfigDocument>;
45
+ /**
46
+ * Upsert the AI config document. Caller is responsible for auth/role checks.
47
+ * Stamps `updatedAt`/`updatedBy`.
48
+ */
49
+ export declare function putAIConfig(db: unknown, next: AIConfigDocument, userId: string): Promise<AIConfigDocument>;
50
+ /** Serialize a full config doc for the client (providers masked). */
51
+ export declare function toPublicConfig(doc: AIConfigDocument): {
52
+ providers: AIProviderConnectionPublic[];
53
+ settings: AISettings;
54
+ };
55
+ //# sourceMappingURL=config-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/ai/config-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,0BAA0B,EAC1B,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,oBAAoB,kBAAkB,CAAA;AAUnD,eAAO,MAAM,iBAAiB,EAAE,gBAG/B,CAAA;AAED,wBAAgB,iBAAiB,IAAI,UAAU,CAM9C;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAIxE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,iBAAiB,CAAC,GAC/D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,WAAW,CAIxE;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,0BAA0B,CAcvF;AAED,yEAAyE;AACzE,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4BxE;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CA2B3B;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG;IACrD,SAAS,EAAE,0BAA0B,EAAE,CAAA;IACvC,QAAQ,EAAE,UAAU,CAAA;CACrB,CAKA"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * DB-backed AI configuration store.
3
+ *
4
+ * Storage: a single Document row with `collection = '__ai_config__'` holding
5
+ * `{ providers, settings, catalog }`, mirroring the SEO config-store pattern
6
+ * (`packages/cms-core/src/seo/config-store.ts`). This keeps Phases 1-2 free of a
7
+ * Prisma migration. The per-run usage table arrives in Phase 4.
8
+ *
9
+ * Security invariants:
10
+ * - Provider API keys are encrypted at rest via `encryptSecret`.
11
+ * - The encrypted key is NEVER returned to the client; handlers serialize
12
+ * providers through {@link toPublicProvider}.
13
+ * - When a provider's env var is set, that key wins and the UI shows it as
14
+ * env-managed/read-only.
15
+ */
16
+ import { decryptSecret, encryptSecret } from '../security/secret-storage.js';
17
+ import { cloneFeatureDefaults, mergeFeatures } from './feature-defaults.js';
18
+ export const AI_CONFIG_COLLECTION = '__ai_config__';
19
+ /** Env var that supplies each built-in provider's key (custom has none). */
20
+ const ENV_KEY_BY_PROVIDER = {
21
+ openai: 'OPENAI_API_KEY',
22
+ anthropic: 'ANTHROPIC_API_KEY',
23
+ xai: 'XAI_API_KEY',
24
+ custom: null,
25
+ };
26
+ export const DEFAULT_AI_BUDGET = {
27
+ alertAtPercentages: [50, 80, 100],
28
+ disableWhenExceeded: false,
29
+ };
30
+ export function defaultAISettings() {
31
+ return {
32
+ features: cloneFeatureDefaults(),
33
+ budget: { ...DEFAULT_AI_BUDGET, alertAtPercentages: [...DEFAULT_AI_BUDGET.alertAtPercentages] },
34
+ logsRetentionDays: 30,
35
+ };
36
+ }
37
+ /** Read the env-managed key for a provider, if present and non-empty. */
38
+ export function getEnvApiKey(provider) {
39
+ const envVar = ENV_KEY_BY_PROVIDER[provider];
40
+ if (!envVar)
41
+ return null;
42
+ const val = process.env[envVar];
43
+ return val && val.trim() ? val.trim() : null;
44
+ }
45
+ /** Last 4 chars of a key for masked display (never the full value). */
46
+ export function last4(key) {
47
+ if (!key)
48
+ return undefined;
49
+ const trimmed = key.trim();
50
+ return trimmed.length >= 4 ? trimmed.slice(-4) : trimmed;
51
+ }
52
+ /**
53
+ * Resolve the effective API key for a connection at call time: an env var (if
54
+ * configured for this provider) always wins, otherwise the decrypted stored key.
55
+ * Returns null when neither exists.
56
+ */
57
+ export async function resolveProviderKey(conn) {
58
+ const envKey = getEnvApiKey(conn.provider);
59
+ if (envKey)
60
+ return envKey;
61
+ if (conn.apiKeyEncrypted) {
62
+ try {
63
+ return await decryptSecret(conn.apiKeyEncrypted);
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ /** Determine where a connection's key comes from for UI display. */
72
+ export function resolveKeySource(conn) {
73
+ if (getEnvApiKey(conn.provider))
74
+ return 'environment';
75
+ if (conn.apiKeyEncrypted)
76
+ return 'database';
77
+ return 'database';
78
+ }
79
+ /** Strip key material and add UI-facing source metadata. */
80
+ export function toPublicProvider(conn) {
81
+ const envKey = getEnvApiKey(conn.provider);
82
+ const source = resolveKeySource(conn);
83
+ const keyManagedExternally = source === 'environment';
84
+ // Reflect the env key's suffix when env-managed, else the stored suffix.
85
+ const maskLast4 = envKey ? last4(envKey) : conn.apiKeyLast4;
86
+ const { apiKeyEncrypted: _omit, ...rest } = conn;
87
+ return {
88
+ ...rest,
89
+ apiKeyLast4: maskLast4,
90
+ apiKeySource: source,
91
+ keyManagedExternally,
92
+ hasKey: Boolean(envKey || conn.apiKeyEncrypted),
93
+ };
94
+ }
95
+ /** Encrypt a plaintext key for storage and compute its masked suffix. */
96
+ export async function encryptProviderKey(plaintext) {
97
+ const apiKeyEncrypted = await encryptSecret(plaintext);
98
+ return { apiKeyEncrypted, apiKeyLast4: last4(plaintext) ?? '' };
99
+ }
100
+ /**
101
+ * Read the AI config document. Returns a fully-populated object (defaults +
102
+ * merged feature flags) even when no row exists yet, so callers never special-
103
+ * case the empty state.
104
+ */
105
+ export async function getAIConfig(db) {
106
+ const d = db;
107
+ const empty = { providers: [], settings: defaultAISettings() };
108
+ if (!d?.document?.findFirst)
109
+ return empty;
110
+ try {
111
+ const doc = await d.document.findFirst({
112
+ where: { collection: AI_CONFIG_COLLECTION, deletedAt: null },
113
+ select: { data: true },
114
+ });
115
+ if (!doc?.data || typeof doc.data !== 'object')
116
+ return empty;
117
+ const data = doc.data;
118
+ const settings = (data.settings ?? {});
119
+ return {
120
+ providers: Array.isArray(data.providers) ? data.providers : [],
121
+ settings: {
122
+ ...defaultAISettings(),
123
+ ...settings,
124
+ features: mergeFeatures(settings.features),
125
+ budget: { ...DEFAULT_AI_BUDGET, ...(settings.budget ?? {}) },
126
+ logsRetentionDays: settings.logsRetentionDays ?? 30,
127
+ },
128
+ catalog: data.catalog,
129
+ updatedAt: data.updatedAt,
130
+ updatedBy: data.updatedBy,
131
+ };
132
+ }
133
+ catch {
134
+ return empty;
135
+ }
136
+ }
137
+ /**
138
+ * Upsert the AI config document. Caller is responsible for auth/role checks.
139
+ * Stamps `updatedAt`/`updatedBy`.
140
+ */
141
+ export async function putAIConfig(db, next, userId) {
142
+ const d = db;
143
+ const data = {
144
+ ...next,
145
+ updatedAt: new Date().toISOString(),
146
+ updatedBy: userId,
147
+ };
148
+ const existing = await d.document.findFirst({
149
+ where: { collection: AI_CONFIG_COLLECTION, deletedAt: null },
150
+ select: { id: true },
151
+ });
152
+ if (existing) {
153
+ await d.document.update({ where: { id: existing.id }, data: { data, updatedById: userId } });
154
+ }
155
+ else {
156
+ await d.document.create({
157
+ data: {
158
+ collection: AI_CONFIG_COLLECTION,
159
+ data,
160
+ status: 'PUBLISHED',
161
+ title: 'AI settings',
162
+ slug: 'ai-config',
163
+ createdById: userId,
164
+ updatedById: userId,
165
+ },
166
+ });
167
+ }
168
+ return data;
169
+ }
170
+ /** Serialize a full config doc for the client (providers masked). */
171
+ export function toPublicConfig(doc) {
172
+ return {
173
+ providers: doc.providers.map(toPublicProvider),
174
+ settings: doc.settings,
175
+ };
176
+ }
177
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/ai/config-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Default AI feature catalog. These are the global feature flags surfaced in
3
+ * Settings > AI and (from Phase 3) enforced across CMS modules via
4
+ * `isAiFeatureEnabled(key)`. Seeded into the `__ai_config__` document on first
5
+ * write; admins toggle `enabled` per feature.
6
+ *
7
+ * Keys follow the `ai.features.*` convention so a single shared service governs
8
+ * every module instead of per-module flags.
9
+ */
10
+ import type { AIFeatureConfig } from './types.js';
11
+ export declare const AI_FEATURE_DEFAULTS: AIFeatureConfig[];
12
+ /** Deep clone so callers can't mutate the shared default array. */
13
+ export declare function cloneFeatureDefaults(): AIFeatureConfig[];
14
+ /**
15
+ * Merge stored feature toggles over the current defaults so newly-added features
16
+ * appear automatically and removed/renamed ones drop off, while preserving the
17
+ * admin's `enabled`/routing choices for features that still exist.
18
+ */
19
+ export declare function mergeFeatures(stored: AIFeatureConfig[] | undefined): AIFeatureConfig[];
20
+ //# sourceMappingURL=feature-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-defaults.d.ts","sourceRoot":"","sources":["../../src/ai/feature-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAO,MAAM,mBAAmB,EAAE,eAAe,EA6DhD,CAAA;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CAQxD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,SAAS,GAAG,eAAe,EAAE,CAetF"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Default AI feature catalog. These are the global feature flags surfaced in
3
+ * Settings > AI and (from Phase 3) enforced across CMS modules via
4
+ * `isAiFeatureEnabled(key)`. Seeded into the `__ai_config__` document on first
5
+ * write; admins toggle `enabled` per feature.
6
+ *
7
+ * Keys follow the `ai.features.*` convention so a single shared service governs
8
+ * every module instead of per-module flags.
9
+ */
10
+ export const AI_FEATURE_DEFAULTS = [
11
+ {
12
+ key: 'ai.features.seo404Recovery',
13
+ label: '404 Recovery suggestions',
14
+ description: 'Recommend redirect targets for broken URLs that still receive traffic.',
15
+ enabled: true,
16
+ category: 'seo',
17
+ requiredCapabilities: ['text', 'reasoning'],
18
+ approvalRequired: true,
19
+ allowBulkApply: false,
20
+ rolesAllowed: ['ADMIN', 'EDITOR'],
21
+ permissionsRequired: ['ai.use'],
22
+ },
23
+ {
24
+ key: 'ai.features.contentWriting',
25
+ label: 'Content writing suggestions',
26
+ description: 'Draft, rewrite, summarize, and improve content in the editor.',
27
+ enabled: true,
28
+ category: 'content',
29
+ requiredCapabilities: ['text'],
30
+ approvalRequired: true,
31
+ allowBulkApply: false,
32
+ rolesAllowed: ['ADMIN', 'EDITOR'],
33
+ permissionsRequired: ['ai.use'],
34
+ },
35
+ {
36
+ key: 'ai.features.mediaAltText',
37
+ label: 'Auto alt-text for media',
38
+ description: 'Generate descriptive alt text for images on upload or in the SEO drawer.',
39
+ enabled: true,
40
+ category: 'media',
41
+ requiredCapabilities: ['vision'],
42
+ approvalRequired: true,
43
+ allowBulkApply: false,
44
+ rolesAllowed: ['ADMIN', 'EDITOR'],
45
+ permissionsRequired: ['ai.use'],
46
+ },
47
+ {
48
+ key: 'ai.features.seoMetaGeneration',
49
+ label: 'SEO meta generation',
50
+ description: 'Generate SEO titles, meta descriptions, and focus keywords from content.',
51
+ enabled: true,
52
+ category: 'seo',
53
+ requiredCapabilities: ['text'],
54
+ approvalRequired: true,
55
+ allowBulkApply: false,
56
+ rolesAllowed: ['ADMIN', 'EDITOR'],
57
+ permissionsRequired: ['ai.use'],
58
+ },
59
+ {
60
+ key: 'ai.features.redirectChainFlattening',
61
+ label: 'Redirect chain flattening',
62
+ description: 'Suggest direct single-hop redirects to collapse redirect chains.',
63
+ enabled: false,
64
+ category: 'seo',
65
+ requiredCapabilities: ['text', 'reasoning'],
66
+ approvalRequired: true,
67
+ allowBulkApply: false,
68
+ rolesAllowed: ['ADMIN'],
69
+ permissionsRequired: ['ai.use'],
70
+ },
71
+ ];
72
+ /** Deep clone so callers can't mutate the shared default array. */
73
+ export function cloneFeatureDefaults() {
74
+ return AI_FEATURE_DEFAULTS.map((f) => ({
75
+ ...f,
76
+ requiredCapabilities: [...f.requiredCapabilities],
77
+ rolesAllowed: [...f.rolesAllowed],
78
+ permissionsRequired: [...f.permissionsRequired],
79
+ fallbackModelIds: f.fallbackModelIds ? [...f.fallbackModelIds] : undefined,
80
+ }));
81
+ }
82
+ /**
83
+ * Merge stored feature toggles over the current defaults so newly-added features
84
+ * appear automatically and removed/renamed ones drop off, while preserving the
85
+ * admin's `enabled`/routing choices for features that still exist.
86
+ */
87
+ export function mergeFeatures(stored) {
88
+ const byKey = new Map((stored ?? []).map((f) => [f.key, f]));
89
+ return cloneFeatureDefaults().map((def) => {
90
+ const prev = byKey.get(def.key);
91
+ if (!prev)
92
+ return def;
93
+ return {
94
+ ...def,
95
+ enabled: typeof prev.enabled === 'boolean' ? prev.enabled : def.enabled,
96
+ providerId: prev.providerId ?? def.providerId,
97
+ modelId: prev.modelId ?? def.modelId,
98
+ fallbackModelIds: prev.fallbackModelIds ?? def.fallbackModelIds,
99
+ maxMonthlyTokens: prev.maxMonthlyTokens ?? def.maxMonthlyTokens,
100
+ maxRequestsPerDay: prev.maxRequestsPerDay ?? def.maxRequestsPerDay,
101
+ };
102
+ });
103
+ }
104
+ //# sourceMappingURL=feature-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-defaults.js","sourceRoot":"","sources":["../../src/ai/feature-defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Barrel for the Settings > AI governance layer (Phases 1-2): provider
3
+ * connections + dynamic model catalog. Feature enforcement and per-run metering
4
+ * arrive in later phases.
5
+ */
6
+ export * from './types.js';
7
+ export { AI_CONFIG_COLLECTION, DEFAULT_AI_BUDGET, defaultAISettings, encryptProviderKey, getAIConfig, getEnvApiKey, last4, putAIConfig, resolveKeySource, resolveProviderKey, toPublicConfig, toPublicProvider, } from './config-store.js';
8
+ export { AI_FEATURE_DEFAULTS, cloneFeatureDefaults, mergeFeatures } from './feature-defaults.js';
9
+ export { curatedFallbackCatalog, normalizeModel } from './catalog.js';
10
+ export { getModels, resolveModelOrUnavailable, syncModels, type SyncModelsResult, } from './models.js';
11
+ export { getUsageSummary } from './usage.js';
12
+ export { getAdapter, listModels as adapterListModels, testConnection as adapterTestConnection, type AdapterContext, } from './providers/index.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,KAAK,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAChG,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,UAAU,EACV,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EACL,UAAU,EACV,UAAU,IAAI,iBAAiB,EAC/B,cAAc,IAAI,qBAAqB,EACvC,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Barrel for the Settings > AI governance layer (Phases 1-2): provider
3
+ * connections + dynamic model catalog. Feature enforcement and per-run metering
4
+ * arrive in later phases.
5
+ */
6
+ export * from './types.js';
7
+ export { AI_CONFIG_COLLECTION, DEFAULT_AI_BUDGET, defaultAISettings, encryptProviderKey, getAIConfig, getEnvApiKey, last4, putAIConfig, resolveKeySource, resolveProviderKey, toPublicConfig, toPublicProvider, } from './config-store.js';
8
+ export { AI_FEATURE_DEFAULTS, cloneFeatureDefaults, mergeFeatures } from './feature-defaults.js';
9
+ export { curatedFallbackCatalog, normalizeModel } from './catalog.js';
10
+ export { getModels, resolveModelOrUnavailable, syncModels, } from './models.js';
11
+ export { getUsageSummary } from './usage.js';
12
+ export { getAdapter, listModels as adapterListModels, testConnection as adapterTestConnection, } from './providers/index.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,KAAK,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAChG,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,UAAU,GAEX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EACL,UAAU,EACV,UAAU,IAAI,iBAAiB,EAC/B,cAAc,IAAI,qBAAqB,GAExC,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Model catalog orchestration: live sync (with curated normalization), curated
3
+ * fallback, and resolution of a configured-but-missing model to an `unavailable`
4
+ * entry so the UI can warn without silently dropping the admin's choice.
5
+ */
6
+ import { AI_CONFIG_COLLECTION } from './config-store.js';
7
+ import type { AIModel } from './types.js';
8
+ export { AI_CONFIG_COLLECTION };
9
+ export interface SyncModelsResult {
10
+ models: AIModel[];
11
+ fromFallback: boolean;
12
+ /** Present when the live listing failed and we fell back to curated data. */
13
+ warning?: string;
14
+ }
15
+ /**
16
+ * Sync the model catalog for a provider connection. Attempts a live listing;
17
+ * on any failure falls back to the curated catalog so the selector is never
18
+ * empty. Persists the result on the `__ai_config__` document under
19
+ * `catalog[connectionId]` and stamps `lastModelSyncAt`.
20
+ */
21
+ export declare function syncModels(db: unknown, connectionId: string): Promise<SyncModelsResult>;
22
+ /**
23
+ * Read the cached catalog for a connection (or all connections). Falls back to
24
+ * the curated catalog for connections that have never been synced so the UI
25
+ * always has something to show.
26
+ */
27
+ export declare function getModels(db: unknown, params?: {
28
+ connectionId?: string;
29
+ provider?: string;
30
+ }): Promise<AIModel[]>;
31
+ /**
32
+ * Resolve a configured model id to a catalog entry. When the id is no longer in
33
+ * the catalog (provider removed/renamed it) returns a synthesized `unavailable`
34
+ * model so the caller can keep the setting and warn the user.
35
+ */
36
+ export declare function resolveModelOrUnavailable(modelId: string | undefined, catalog: AIModel[]): AIModel | null;
37
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/ai/models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EAIrB,MAAM,mBAAmB,CAAA;AAI1B,OAAO,KAAK,EAAkB,OAAO,EAAwB,MAAM,YAAY,CAAA;AAE/E,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAW/B,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,EAAE,CAAA;IACjB,YAAY,EAAE,OAAO,CAAA;IACrB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2D7F;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,EAAE,EAAE,OAAO,EACX,MAAM,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,OAAO,EAAE,CAAC,CAiBpB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,OAAO,EAAE,GACjB,OAAO,GAAG,IAAI,CAgBhB"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Model catalog orchestration: live sync (with curated normalization), curated
3
+ * fallback, and resolution of a configured-but-missing model to an `unavailable`
4
+ * entry so the UI can warn without silently dropping the admin's choice.
5
+ */
6
+ import { AI_CONFIG_COLLECTION, getAIConfig, putAIConfig, resolveProviderKey, } from './config-store.js';
7
+ import { curatedFallbackCatalog, normalizeModel } from './catalog.js';
8
+ import { listModels as adapterListModels } from './providers/index.js';
9
+ export { AI_CONFIG_COLLECTION };
10
+ function adapterContextFor(conn, apiKey) {
11
+ return {
12
+ apiKey,
13
+ baseUrl: conn.baseUrl,
14
+ organizationId: conn.organizationId,
15
+ projectId: conn.projectId,
16
+ };
17
+ }
18
+ /**
19
+ * Sync the model catalog for a provider connection. Attempts a live listing;
20
+ * on any failure falls back to the curated catalog so the selector is never
21
+ * empty. Persists the result on the `__ai_config__` document under
22
+ * `catalog[connectionId]` and stamps `lastModelSyncAt`.
23
+ */
24
+ export async function syncModels(db, connectionId) {
25
+ const config = await getAIConfig(db);
26
+ const conn = config.providers.find((p) => p.id === connectionId);
27
+ if (!conn)
28
+ throw new Error('Provider connection not found');
29
+ const now = new Date().toISOString();
30
+ const apiKey = await resolveProviderKey(conn);
31
+ let models;
32
+ let fromFallback = false;
33
+ let warning;
34
+ if (!apiKey) {
35
+ models = curatedFallbackCatalog(conn.provider, now);
36
+ fromFallback = true;
37
+ warning = 'No API key configured; showing the curated model list.';
38
+ }
39
+ else {
40
+ try {
41
+ const ids = await adapterListModels(conn.provider, adapterContextFor(conn, apiKey));
42
+ if (ids.length === 0) {
43
+ models = curatedFallbackCatalog(conn.provider, now);
44
+ fromFallback = true;
45
+ warning = 'The provider returned no models; showing the curated list.';
46
+ }
47
+ else {
48
+ models = ids.map((providerModelId) => normalizeModel({
49
+ provider: conn.provider,
50
+ providerModelId,
51
+ source: 'provider',
52
+ status: 'available',
53
+ lastSyncedAt: now,
54
+ }));
55
+ }
56
+ }
57
+ catch (err) {
58
+ models = curatedFallbackCatalog(conn.provider, now);
59
+ fromFallback = true;
60
+ warning =
61
+ err instanceof Error
62
+ ? `Live model listing failed (${err.message}); showing the curated list.`
63
+ : 'Live model listing failed; showing the curated list.';
64
+ }
65
+ }
66
+ const entry = { models, lastSyncedAt: now, fromFallback };
67
+ const nextProviders = config.providers.map((p) => p.id === connectionId ? { ...p, lastModelSyncAt: now } : p);
68
+ await putAIConfig(db, {
69
+ ...config,
70
+ providers: nextProviders,
71
+ catalog: { ...(config.catalog ?? {}), [connectionId]: entry },
72
+ }, conn.updatedBy || 'system');
73
+ return { models, fromFallback, warning };
74
+ }
75
+ /**
76
+ * Read the cached catalog for a connection (or all connections). Falls back to
77
+ * the curated catalog for connections that have never been synced so the UI
78
+ * always has something to show.
79
+ */
80
+ export async function getModels(db, params) {
81
+ const config = await getAIConfig(db);
82
+ const now = new Date().toISOString();
83
+ const out = [];
84
+ const conns = config.providers.filter((p) => {
85
+ if (params?.connectionId)
86
+ return p.id === params.connectionId;
87
+ if (params?.provider)
88
+ return p.provider === params.provider;
89
+ return true;
90
+ });
91
+ for (const conn of conns) {
92
+ const cached = config.catalog?.[conn.id];
93
+ if (cached?.models?.length)
94
+ out.push(...cached.models);
95
+ else
96
+ out.push(...curatedFallbackCatalog(conn.provider, now));
97
+ }
98
+ // De-dupe by normalized id, preferring the first (cached/live) occurrence.
99
+ const seen = new Set();
100
+ return out.filter((m) => (seen.has(m.id) ? false : (seen.add(m.id), true)));
101
+ }
102
+ /**
103
+ * Resolve a configured model id to a catalog entry. When the id is no longer in
104
+ * the catalog (provider removed/renamed it) returns a synthesized `unavailable`
105
+ * model so the caller can keep the setting and warn the user.
106
+ */
107
+ export function resolveModelOrUnavailable(modelId, catalog) {
108
+ if (!modelId)
109
+ return null;
110
+ const found = catalog.find((m) => m.id === modelId || m.providerModelId === modelId);
111
+ if (found)
112
+ return found;
113
+ const parts = modelId.split(':');
114
+ const provider = parts[0] ?? '';
115
+ const providerModelId = parts.slice(1).join(':') || modelId;
116
+ return normalizeModel({
117
+ provider: (['openai', 'anthropic', 'xai', 'custom'].includes(provider)
118
+ ? provider
119
+ : 'custom'),
120
+ providerModelId,
121
+ source: 'config',
122
+ status: 'unavailable',
123
+ lastSyncedAt: new Date().toISOString(),
124
+ });
125
+ }
126
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/ai/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Anthropic adapter. Uses the `/v1/models` listing endpoint with `x-api-key`
3
+ * and the required `anthropic-version` header. Hostname is fixed.
4
+ */
5
+ import type { AIConnectionTestResult } from '../types.js';
6
+ import { type AdapterContext } from './http.js';
7
+ export declare function testConnection(ctx: AdapterContext): Promise<AIConnectionTestResult>;
8
+ export declare function listModels(ctx: AdapterContext): Promise<string[]>;
9
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,KAAK,cAAc,EAKpB,MAAM,WAAW,CAAA;AASlB,wBAAsB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAqBzF;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQvE"}