@actuate-media/cms-core 0.41.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 (101) 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/__tests__/seo/settings-defaults.test.d.ts +2 -0
  6. package/dist/__tests__/seo/settings-defaults.test.d.ts.map +1 -0
  7. package/dist/__tests__/seo/settings-defaults.test.js +189 -0
  8. package/dist/__tests__/seo/settings-defaults.test.js.map +1 -0
  9. package/dist/__tests__/seo/sitemap-notify.test.d.ts +2 -0
  10. package/dist/__tests__/seo/sitemap-notify.test.d.ts.map +1 -0
  11. package/dist/__tests__/seo/sitemap-notify.test.js +191 -0
  12. package/dist/__tests__/seo/sitemap-notify.test.js.map +1 -0
  13. package/dist/actions.d.ts.map +1 -1
  14. package/dist/actions.js +80 -3
  15. package/dist/actions.js.map +1 -1
  16. package/dist/ai/catalog.d.ts +29 -0
  17. package/dist/ai/catalog.d.ts.map +1 -0
  18. package/dist/ai/catalog.js +340 -0
  19. package/dist/ai/catalog.js.map +1 -0
  20. package/dist/ai/config-store.d.ts +55 -0
  21. package/dist/ai/config-store.d.ts.map +1 -0
  22. package/dist/ai/config-store.js +177 -0
  23. package/dist/ai/config-store.js.map +1 -0
  24. package/dist/ai/feature-defaults.d.ts +20 -0
  25. package/dist/ai/feature-defaults.d.ts.map +1 -0
  26. package/dist/ai/feature-defaults.js +104 -0
  27. package/dist/ai/feature-defaults.js.map +1 -0
  28. package/dist/ai/index.d.ts +13 -0
  29. package/dist/ai/index.d.ts.map +1 -0
  30. package/dist/ai/index.js +13 -0
  31. package/dist/ai/index.js.map +1 -0
  32. package/dist/ai/models.d.ts +37 -0
  33. package/dist/ai/models.d.ts.map +1 -0
  34. package/dist/ai/models.js +126 -0
  35. package/dist/ai/models.js.map +1 -0
  36. package/dist/ai/providers/anthropic.d.ts +9 -0
  37. package/dist/ai/providers/anthropic.d.ts.map +1 -0
  38. package/dist/ai/providers/anthropic.js +36 -0
  39. package/dist/ai/providers/anthropic.js.map +1 -0
  40. package/dist/ai/providers/custom.d.ts +11 -0
  41. package/dist/ai/providers/custom.d.ts.map +1 -0
  42. package/dist/ai/providers/custom.js +70 -0
  43. package/dist/ai/providers/custom.js.map +1 -0
  44. package/dist/ai/providers/http.d.ts +32 -0
  45. package/dist/ai/providers/http.d.ts.map +1 -0
  46. package/dist/ai/providers/http.js +90 -0
  47. package/dist/ai/providers/http.js.map +1 -0
  48. package/dist/ai/providers/index.d.ts +16 -0
  49. package/dist/ai/providers/index.d.ts.map +1 -0
  50. package/dist/ai/providers/index.js +25 -0
  51. package/dist/ai/providers/index.js.map +1 -0
  52. package/dist/ai/providers/openai.d.ts +10 -0
  53. package/dist/ai/providers/openai.d.ts.map +1 -0
  54. package/dist/ai/providers/openai.js +41 -0
  55. package/dist/ai/providers/openai.js.map +1 -0
  56. package/dist/ai/providers/xai.d.ts +9 -0
  57. package/dist/ai/providers/xai.d.ts.map +1 -0
  58. package/dist/ai/providers/xai.js +35 -0
  59. package/dist/ai/providers/xai.js.map +1 -0
  60. package/dist/ai/types.d.ts +161 -0
  61. package/dist/ai/types.d.ts.map +1 -0
  62. package/dist/ai/types.js +11 -0
  63. package/dist/ai/types.js.map +1 -0
  64. package/dist/ai/usage.d.ts +18 -0
  65. package/dist/ai/usage.d.ts.map +1 -0
  66. package/dist/ai/usage.js +70 -0
  67. package/dist/ai/usage.js.map +1 -0
  68. package/dist/api/handlers.d.ts.map +1 -1
  69. package/dist/api/handlers.js +539 -10
  70. package/dist/api/handlers.js.map +1 -1
  71. package/dist/config/types.d.ts +49 -0
  72. package/dist/config/types.d.ts.map +1 -1
  73. package/dist/index.d.ts +3 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +4 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/page-builder/schema.d.ts +2 -2
  78. package/dist/seo/config-store.d.ts +2 -0
  79. package/dist/seo/config-store.d.ts.map +1 -1
  80. package/dist/seo/config-store.js +2 -0
  81. package/dist/seo/config-store.js.map +1 -1
  82. package/dist/seo/index.d.ts +6 -4
  83. package/dist/seo/index.d.ts.map +1 -1
  84. package/dist/seo/index.js +3 -2
  85. package/dist/seo/index.js.map +1 -1
  86. package/dist/seo/meta-tags.d.ts +36 -0
  87. package/dist/seo/meta-tags.d.ts.map +1 -1
  88. package/dist/seo/meta-tags.js +78 -0
  89. package/dist/seo/meta-tags.js.map +1 -1
  90. package/dist/seo/page-meta.d.ts.map +1 -1
  91. package/dist/seo/page-meta.js +47 -8
  92. package/dist/seo/page-meta.js.map +1 -1
  93. package/dist/seo/sitemap-notify.d.ts +85 -0
  94. package/dist/seo/sitemap-notify.d.ts.map +1 -0
  95. package/dist/seo/sitemap-notify.js +159 -0
  96. package/dist/seo/sitemap-notify.js.map +1 -0
  97. package/dist/seo/title-templates.d.ts +26 -0
  98. package/dist/seo/title-templates.d.ts.map +1 -1
  99. package/dist/seo/title-templates.js +83 -0
  100. package/dist/seo/title-templates.js.map +1 -1
  101. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Provider adapter dispatcher. Selects the right adapter by provider key and
3
+ * exposes a uniform `testConnection` / `listModels` surface to the catalog and
4
+ * route layers.
5
+ */
6
+ import * as anthropic from './anthropic.js';
7
+ import * as custom from './custom.js';
8
+ import * as openai from './openai.js';
9
+ import * as xai from './xai.js';
10
+ const ADAPTERS = {
11
+ openai,
12
+ anthropic,
13
+ xai,
14
+ custom,
15
+ };
16
+ export function getAdapter(provider) {
17
+ return ADAPTERS[provider] ?? custom;
18
+ }
19
+ export function testConnection(provider, ctx) {
20
+ return getAdapter(provider).testConnection(ctx);
21
+ }
22
+ export function listModels(provider, ctx) {
23
+ return getAdapter(provider).listModels(ctx);
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAS/B,MAAM,QAAQ,GAA2C;IACvD,MAAM;IACN,SAAS;IACT,GAAG;IACH,MAAM;CACP,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,QAAuB;IAChD,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAuB,EACvB,GAAmB;IAEnB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAuB,EAAE,GAAmB;IACrE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * OpenAI (and OpenAI-compatible) adapter. Uses the `/v1/models` listing
3
+ * endpoint with Bearer auth. Hostname is fixed (api.openai.com) so no SSRF
4
+ * validation is needed here.
5
+ */
6
+ import type { AIConnectionTestResult } from '../types.js';
7
+ import { type AdapterContext } from './http.js';
8
+ export declare function testConnection(ctx: AdapterContext): Promise<AIConnectionTestResult>;
9
+ export declare function listModels(ctx: AdapterContext): Promise<string[]>;
10
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,KAAK,cAAc,EAKpB,MAAM,WAAW,CAAA;AAWlB,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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * OpenAI (and OpenAI-compatible) adapter. Uses the `/v1/models` listing
3
+ * endpoint with Bearer auth. Hostname is fixed (api.openai.com) so no SSRF
4
+ * validation is needed here.
5
+ */
6
+ import { extractModelIds, messageFromStatus, statusFromHttp, timedFetch, } from './http.js';
7
+ const OPENAI_BASE = 'https://api.openai.com/v1';
8
+ function headers(ctx) {
9
+ const h = { authorization: `Bearer ${ctx.apiKey}` };
10
+ if (ctx.organizationId)
11
+ h['openai-organization'] = ctx.organizationId;
12
+ if (ctx.projectId)
13
+ h['openai-project'] = ctx.projectId;
14
+ return h;
15
+ }
16
+ export async function testConnection(ctx) {
17
+ const testedAt = new Date().toISOString();
18
+ if (!ctx.apiKey) {
19
+ return { ok: false, status: 'needs_setup', message: messageFromStatus('needs_setup'), testedAt };
20
+ }
21
+ try {
22
+ const res = await timedFetch(`${OPENAI_BASE}/models`, { method: 'GET', headers: headers(ctx) }, ctx);
23
+ const status = statusFromHttp(res.status);
24
+ return { ok: status === 'connected', status, message: messageFromStatus(status), testedAt };
25
+ }
26
+ catch {
27
+ return {
28
+ ok: false,
29
+ status: 'provider_down',
30
+ message: messageFromStatus('provider_down'),
31
+ testedAt,
32
+ };
33
+ }
34
+ }
35
+ export async function listModels(ctx) {
36
+ const res = await timedFetch(`${OPENAI_BASE}/models`, { method: 'GET', headers: headers(ctx) }, ctx);
37
+ if (!res.ok)
38
+ throw new Error(`OpenAI model listing failed (${res.status})`);
39
+ return extractModelIds(await res.json());
40
+ }
41
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/ai/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAEL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,UAAU,GACX,MAAM,WAAW,CAAA;AAElB,MAAM,WAAW,GAAG,2BAA2B,CAAA;AAE/C,SAAS,OAAO,CAAC,GAAmB;IAClC,MAAM,CAAC,GAA2B,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;IAC3E,IAAI,GAAG,CAAC,cAAc;QAAE,CAAC,CAAC,qBAAqB,CAAC,GAAG,GAAG,CAAC,cAAc,CAAA;IACrE,IAAI,GAAG,CAAC,SAAS;QAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,GAAG,CAAC,SAAS,CAAA;IACtD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAmB;IACtD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACzC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAA;IAClG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,WAAW,SAAS,EACvB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EACxC,GAAG,CACJ,CAAA;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACzC,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC;YAC3C,QAAQ;SACT,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAmB;IAClD,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,WAAW,SAAS,EACvB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EACxC,GAAG,CACJ,CAAA;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IAC3E,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * xAI (Grok) adapter. xAI's API is OpenAI-compatible: `/v1/models` with Bearer
3
+ * auth. Hostname is fixed (api.x.ai).
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=xai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/xai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,KAAK,cAAc,EAKpB,MAAM,WAAW,CAAA;AAQlB,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,CAIvE"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * xAI (Grok) adapter. xAI's API is OpenAI-compatible: `/v1/models` with Bearer
3
+ * auth. Hostname is fixed (api.x.ai).
4
+ */
5
+ import { extractModelIds, messageFromStatus, statusFromHttp, timedFetch, } from './http.js';
6
+ const XAI_BASE = 'https://api.x.ai/v1';
7
+ function headers(ctx) {
8
+ return { authorization: `Bearer ${ctx.apiKey}` };
9
+ }
10
+ export async function testConnection(ctx) {
11
+ const testedAt = new Date().toISOString();
12
+ if (!ctx.apiKey) {
13
+ return { ok: false, status: 'needs_setup', message: messageFromStatus('needs_setup'), testedAt };
14
+ }
15
+ try {
16
+ const res = await timedFetch(`${XAI_BASE}/models`, { method: 'GET', headers: headers(ctx) }, ctx);
17
+ const status = statusFromHttp(res.status);
18
+ return { ok: status === 'connected', status, message: messageFromStatus(status), testedAt };
19
+ }
20
+ catch {
21
+ return {
22
+ ok: false,
23
+ status: 'provider_down',
24
+ message: messageFromStatus('provider_down'),
25
+ testedAt,
26
+ };
27
+ }
28
+ }
29
+ export async function listModels(ctx) {
30
+ const res = await timedFetch(`${XAI_BASE}/models`, { method: 'GET', headers: headers(ctx) }, ctx);
31
+ if (!res.ok)
32
+ throw new Error(`xAI model listing failed (${res.status})`);
33
+ return extractModelIds(await res.json());
34
+ }
35
+ //# sourceMappingURL=xai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/ai/providers/xai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAEL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,UAAU,GACX,MAAM,WAAW,CAAA;AAElB,MAAM,QAAQ,GAAG,qBAAqB,CAAA;AAEtC,SAAS,OAAO,CAAC,GAAmB;IAClC,OAAO,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAmB;IACtD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACzC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAA;IAClG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,QAAQ,SAAS,EACpB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EACxC,GAAG,CACJ,CAAA;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACzC,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC;YAC3C,QAAQ;SACT,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAmB;IAClD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,QAAQ,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACjG,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IACxE,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Shared types for the Settings > AI governance layer.
3
+ *
4
+ * Phases 1-2 cover provider connections (encrypted keys) and a dynamic,
5
+ * normalized model catalog. Feature config, budget, and data-policy shapes are
6
+ * declared here for forward-compatibility (enforcement + metering land in later
7
+ * phases) but only `features[].enabled` and `budget.monthlyTokenLimit` are
8
+ * wired into the UI for now.
9
+ */
10
+ /** Provider keys are stable code identifiers. `openai` covers OpenAI/ChatGPT. */
11
+ export type AIProviderKey = 'openai' | 'anthropic' | 'xai' | 'custom';
12
+ /** Where a provider's API key actually comes from at runtime. */
13
+ export type AIKeySource = 'environment' | 'database' | 'config';
14
+ /** Connection health surfaced in the UI (always rendered as text, not color-only). */
15
+ export type AIConnectionStatus = 'connected' | 'invalid_key' | 'rate_limited' | 'provider_down' | 'needs_setup' | 'unknown';
16
+ /** Availability of a catalog model relative to the connected account. */
17
+ export type AIModelStatus = 'available' | 'unavailable' | 'deprecated' | 'unknown';
18
+ export interface AIModelCapabilities {
19
+ text: boolean;
20
+ vision: boolean;
21
+ imageGeneration: boolean;
22
+ embeddings: boolean;
23
+ toolCalling: boolean;
24
+ structuredOutput: boolean;
25
+ streaming: boolean;
26
+ reasoning: boolean;
27
+ longContext: boolean;
28
+ }
29
+ export interface AIModelPricing {
30
+ inputPerMillion?: number;
31
+ outputPerMillion?: number;
32
+ image?: number;
33
+ search?: number;
34
+ }
35
+ /** Normalized model record (merged from live listing + curated metadata). */
36
+ export interface AIModel {
37
+ /** Stable internal id: `${provider}:${providerModelId}`. */
38
+ id: string;
39
+ provider: AIProviderKey;
40
+ providerModelId: string;
41
+ displayName: string;
42
+ description?: string;
43
+ status: AIModelStatus;
44
+ capabilities: AIModelCapabilities;
45
+ contextWindow?: number;
46
+ maxOutputTokens?: number;
47
+ inputModalities: string[];
48
+ outputModalities: string[];
49
+ pricing?: AIModelPricing;
50
+ aliases?: string[];
51
+ lastSyncedAt: string;
52
+ source: 'provider' | 'manual' | 'config';
53
+ metadata: Record<string, unknown>;
54
+ }
55
+ /**
56
+ * Stored provider connection. The encrypted key NEVER leaves the server — API
57
+ * responses use {@link AIProviderConnectionPublic}.
58
+ */
59
+ export interface AIProviderConnection {
60
+ id: string;
61
+ provider: AIProviderKey;
62
+ displayName: string;
63
+ enabled: boolean;
64
+ status: AIConnectionStatus;
65
+ /** Encrypted via `encryptSecret`. Absent when the key is env-managed. */
66
+ apiKeyEncrypted?: string;
67
+ apiKeyLast4?: string;
68
+ baseUrl?: string;
69
+ organizationId?: string;
70
+ projectId?: string;
71
+ lastTestedAt?: string;
72
+ lastSuccessfulRunAt?: string;
73
+ lastModelSyncAt?: string;
74
+ createdAt: string;
75
+ updatedAt: string;
76
+ updatedBy: string;
77
+ }
78
+ /** Client-safe provider view: no key material, source resolved dynamically. */
79
+ export type AIProviderConnectionPublic = Omit<AIProviderConnection, 'apiKeyEncrypted'> & {
80
+ apiKeySource: AIKeySource;
81
+ /** True when the key is env-managed and therefore not editable in the UI. */
82
+ keyManagedExternally: boolean;
83
+ hasKey: boolean;
84
+ };
85
+ export type AIFeatureCategory = 'seo' | 'media' | 'content' | 'forms' | 'security' | 'developer' | 'search';
86
+ export interface AIFeatureConfig {
87
+ key: string;
88
+ label: string;
89
+ description: string;
90
+ enabled: boolean;
91
+ category: AIFeatureCategory;
92
+ requiredCapabilities: string[];
93
+ providerId?: string;
94
+ modelId?: string;
95
+ fallbackModelIds?: string[];
96
+ approvalRequired: boolean;
97
+ allowBulkApply: boolean;
98
+ maxMonthlyTokens?: number;
99
+ maxRequestsPerDay?: number;
100
+ rolesAllowed: string[];
101
+ permissionsRequired: string[];
102
+ dataPolicyKey?: string;
103
+ }
104
+ export interface AIBudgetSettings {
105
+ monthlyTokenLimit?: number;
106
+ monthlyCostLimit?: number;
107
+ alertAtPercentages: number[];
108
+ disableWhenExceeded: boolean;
109
+ perFeatureLimits?: Record<string, number>;
110
+ perUserLimits?: Record<string, number>;
111
+ }
112
+ export interface AISettings {
113
+ defaultProviderId?: string;
114
+ defaultModelId?: string;
115
+ defaultTextModelId?: string;
116
+ defaultReasoningModelId?: string;
117
+ defaultVisionModelId?: string;
118
+ defaultEmbeddingModelId?: string;
119
+ defaultImageGenerationModelId?: string;
120
+ features: AIFeatureConfig[];
121
+ budget: AIBudgetSettings;
122
+ logsRetentionDays: number;
123
+ }
124
+ /**
125
+ * Cached, normalized model catalog keyed by provider connection id. Persisted in
126
+ * the `__ai_config__` document so the model selector renders without a live call.
127
+ */
128
+ export interface AICatalogEntry {
129
+ models: AIModel[];
130
+ lastSyncedAt: string;
131
+ /** True when the entry came from the curated fallback (no live listing). */
132
+ fromFallback: boolean;
133
+ }
134
+ /** Shape of the `data` blob on the `__ai_config__` Document. */
135
+ export interface AIConfigDocument {
136
+ providers: AIProviderConnection[];
137
+ settings: AISettings;
138
+ catalog?: Record<string, AICatalogEntry>;
139
+ updatedAt?: string;
140
+ updatedBy?: string;
141
+ }
142
+ /** Monthly usage summary for the budget meter (real counts; 0 until Phase 4). */
143
+ export interface AIUsageSummary {
144
+ totalTokens: number;
145
+ promptTokens: number;
146
+ completionTokens: number;
147
+ estimatedCost?: number;
148
+ monthlyTokenLimit?: number;
149
+ periodStart: string;
150
+ periodEnd: string;
151
+ runCount: number;
152
+ }
153
+ /** Result of an adapter connection test. */
154
+ export interface AIConnectionTestResult {
155
+ ok: boolean;
156
+ status: AIConnectionStatus;
157
+ /** Human-readable detail (safe to show; never contains the key). */
158
+ message: string;
159
+ testedAt: string;
160
+ }
161
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared types for the Settings > AI governance layer.
3
+ *
4
+ * Phases 1-2 cover provider connections (encrypted keys) and a dynamic,
5
+ * normalized model catalog. Feature config, budget, and data-policy shapes are
6
+ * declared here for forward-compatibility (enforcement + metering land in later
7
+ * phases) but only `features[].enabled` and `budget.monthlyTokenLimit` are
8
+ * wired into the UI for now.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * AI usage aggregation.
3
+ *
4
+ * Until the dedicated per-run metering table lands (Phase 4), usage is derived
5
+ * from token totals already recorded in `actuate_audit_logs` (`details
6
+ * .totalTokensUsed` / `details.tokensUsed`). This returns REAL counts — it is 0
7
+ * when nothing has run, never a fabricated number.
8
+ */
9
+ import type { AIUsageSummary } from './types.js';
10
+ /**
11
+ * Sum token usage from audit-log entries within the period. Recognizes the
12
+ * fields current AI handlers write today and is tolerant of missing data.
13
+ */
14
+ export declare function getUsageSummary(db: unknown, period?: {
15
+ start?: Date;
16
+ end?: Date;
17
+ }): Promise<AIUsageSummary>;
18
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/ai/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAgBhD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,OAAO,EACX,MAAM,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACpC,OAAO,CAAC,cAAc,CAAC,CAiDzB"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * AI usage aggregation.
3
+ *
4
+ * Until the dedicated per-run metering table lands (Phase 4), usage is derived
5
+ * from token totals already recorded in `actuate_audit_logs` (`details
6
+ * .totalTokensUsed` / `details.tokensUsed`). This returns REAL counts — it is 0
7
+ * when nothing has run, never a fabricated number.
8
+ */
9
+ import { getAIConfig } from './config-store.js';
10
+ /** First instant of the current calendar month (UTC). */
11
+ function monthStart(now = new Date()) {
12
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1, 0, 0, 0, 0));
13
+ }
14
+ /** First instant of the next calendar month (UTC). */
15
+ function nextMonthStart(now = new Date()) {
16
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1, 0, 0, 0, 0));
17
+ }
18
+ function num(value) {
19
+ return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 0;
20
+ }
21
+ /**
22
+ * Sum token usage from audit-log entries within the period. Recognizes the
23
+ * fields current AI handlers write today and is tolerant of missing data.
24
+ */
25
+ export async function getUsageSummary(db, period) {
26
+ const start = period?.start ?? monthStart();
27
+ const end = period?.end ?? nextMonthStart();
28
+ const config = await getAIConfig(db);
29
+ const monthlyTokenLimit = config.settings.budget.monthlyTokenLimit;
30
+ const base = {
31
+ totalTokens: 0,
32
+ promptTokens: 0,
33
+ completionTokens: 0,
34
+ monthlyTokenLimit,
35
+ periodStart: start.toISOString(),
36
+ periodEnd: end.toISOString(),
37
+ runCount: 0,
38
+ };
39
+ const d = db;
40
+ if (!d?.auditLog?.findMany)
41
+ return base;
42
+ let rows = [];
43
+ try {
44
+ rows = await d.auditLog.findMany({
45
+ where: { createdAt: { gte: start, lt: end } },
46
+ select: { details: true },
47
+ });
48
+ }
49
+ catch {
50
+ return base;
51
+ }
52
+ let totalTokens = 0;
53
+ let promptTokens = 0;
54
+ let completionTokens = 0;
55
+ let runCount = 0;
56
+ for (const row of rows) {
57
+ const details = (row?.details ?? {});
58
+ const total = num(details.totalTokensUsed) + num(details.tokensUsed) + num(details.totalTokens);
59
+ const prompt = num(details.promptTokens);
60
+ const completion = num(details.completionTokens);
61
+ if (total > 0 || prompt > 0 || completion > 0) {
62
+ runCount += 1;
63
+ totalTokens += total > 0 ? total : prompt + completion;
64
+ promptTokens += prompt;
65
+ completionTokens += completion;
66
+ }
67
+ }
68
+ return { ...base, totalTokens, promptTokens, completionTokens, runCount };
69
+ }
70
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/ai/usage.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/api/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAuhC5C,iFAAiF;AACjF,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AA8JD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS9E;AAiVD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA47WzD"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/api/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAwhC5C,iFAAiF;AACjF,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AA8JD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS9E;AAiVD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqiYzD"}