@actuate-media/cms-admin 0.34.0 → 0.36.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 (29) hide show
  1. package/dist/__tests__/views/ai-settings.render.test.js +69 -0
  2. package/dist/__tests__/views/ai-settings.render.test.js.map +1 -1
  3. package/dist/actuate-admin.css +1 -1
  4. package/dist/views/settings/AISettingsTab.d.ts.map +1 -1
  5. package/dist/views/settings/AISettingsTab.js +2 -1
  6. package/dist/views/settings/AISettingsTab.js.map +1 -1
  7. package/dist/views/settings/AiFeaturesCard.d.ts +10 -5
  8. package/dist/views/settings/AiFeaturesCard.d.ts.map +1 -1
  9. package/dist/views/settings/AiFeaturesCard.js +26 -5
  10. package/dist/views/settings/AiFeaturesCard.js.map +1 -1
  11. package/dist/views/settings/BrandVoiceCard.d.ts +12 -0
  12. package/dist/views/settings/BrandVoiceCard.d.ts.map +1 -0
  13. package/dist/views/settings/BrandVoiceCard.js +27 -0
  14. package/dist/views/settings/BrandVoiceCard.js.map +1 -0
  15. package/dist/views/settings/featureModel.d.ts +25 -0
  16. package/dist/views/settings/featureModel.d.ts.map +1 -0
  17. package/dist/views/settings/featureModel.js +45 -0
  18. package/dist/views/settings/featureModel.js.map +1 -0
  19. package/dist/views/settings/useAiSettings.d.ts +18 -0
  20. package/dist/views/settings/useAiSettings.d.ts.map +1 -1
  21. package/dist/views/settings/useAiSettings.js +73 -3
  22. package/dist/views/settings/useAiSettings.js.map +1 -1
  23. package/package.json +2 -2
  24. package/src/__tests__/views/ai-settings.render.test.tsx +97 -0
  25. package/src/views/settings/AISettingsTab.tsx +10 -1
  26. package/src/views/settings/AiFeaturesCard.tsx +117 -12
  27. package/src/views/settings/BrandVoiceCard.tsx +152 -0
  28. package/src/views/settings/featureModel.ts +64 -0
  29. package/src/views/settings/useAiSettings.ts +107 -3
@@ -1,14 +1,35 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { AlertTriangle } from 'lucide-react';
3
4
  import { useId } from 'react';
4
5
  import { SettingsToggleRow } from './components.js';
6
+ import { capabilityLabel, effectiveFeatureModel, isModelCompatible } from './featureModel.js';
7
+ const SELECT_CLASS = 'w-full rounded-md border border-border bg-input-background px-3 py-2 text-sm text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-60';
5
8
  /**
6
- * Global AI feature toggles. Each switch persists (via the Save bar) to the
7
- * shared `ai.features.*` flags. Enforcement across modules lands in a later
8
- * phase; here we surface and store the operator's intent.
9
+ * Global AI feature toggles with per-feature model routing. Each switch persists
10
+ * (via the Save bar) to the shared `ai.features.*` flags; the optional model
11
+ * picker overrides which model that feature uses (otherwise it inherits the
12
+ * default). Enforcement across modules lands in a later phase; here we surface
13
+ * and store the operator's intent.
9
14
  */
10
- export function AiFeaturesCard({ features, canEdit, onToggle, }) {
15
+ export function AiFeaturesCard({ features, models, defaultModelId, canEdit, onToggle, onSetFeatureModel, }) {
11
16
  const headingId = useId();
12
- return (_jsxs("section", { "aria-labelledby": headingId, className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h3", { id: headingId, className: "text-foreground mb-1 text-base font-medium", children: "AI Features" }), _jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: "Turn individual AI-powered features on or off across the CMS." }), features.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "No AI features are available." })) : (_jsx("div", { className: "space-y-4", children: features.map((f) => (_jsx(SettingsToggleRow, { label: f.label, description: f.description, checked: f.enabled, disabled: !canEdit, onChange: (v) => onToggle(f.key, v) }, f.key))) }))] }));
17
+ return (_jsxs("section", { "aria-labelledby": headingId, className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h3", { id: headingId, className: "text-foreground mb-1 text-base font-medium", children: "AI Features" }), _jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: "Turn individual AI-powered features on or off, and optionally route each to a specific model." }), features.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "No AI features are available." })) : (_jsx("div", { className: "divide-border divide-y", children: features.map((f) => (_jsx(FeatureRow, { feature: f, models: models, defaultModelId: defaultModelId, canEdit: canEdit, onToggle: onToggle, onSetFeatureModel: onSetFeatureModel }, f.key))) }))] }));
18
+ }
19
+ function FeatureRow({ feature, models, defaultModelId, canEdit, onToggle, onSetFeatureModel, }) {
20
+ const selectId = useId();
21
+ const required = feature.requiredCapabilities ?? [];
22
+ const effective = effectiveFeatureModel(feature.modelId, defaultModelId, required, models);
23
+ const defaultModel = models.find((m) => m.id === defaultModelId || m.providerModelId === defaultModelId);
24
+ const hasModels = models.length > 0;
25
+ const defaultLabel = defaultModel
26
+ ? `Use default (${defaultModel.displayName})`
27
+ : 'Use default model';
28
+ return (_jsxs("div", { className: "py-4 first:pt-0 last:pb-0", children: [_jsx(SettingsToggleRow, { label: feature.label, description: feature.description, checked: feature.enabled, disabled: !canEdit, onChange: (v) => onToggle(feature.key, v) }), feature.enabled && (_jsxs("div", { className: "mt-3 pl-0", children: [_jsx("label", { htmlFor: selectId, className: "text-muted-foreground mb-1 block text-sm", children: "Model" }), hasModels ? (_jsxs("select", { id: selectId, value: feature.modelId ?? '', disabled: !canEdit, onChange: (e) => onSetFeatureModel(feature.key, e.target.value), className: SELECT_CLASS, children: [_jsx("option", { value: "", children: defaultLabel }), models.map((m) => {
29
+ const compatible = isModelCompatible(m, required);
30
+ return (_jsxs("option", { value: m.id, disabled: !compatible, children: [m.displayName, m.status === 'unavailable' ? ' (unavailable)' : '', m.status !== 'unavailable' && !compatible ? ' (incompatible)' : ''] }, m.id));
31
+ })] })) : (_jsx("p", { className: "text-muted-foreground text-sm", children: "Connect a provider and refresh models to route this feature." })), hasModels && !effective.isOverride && (_jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: effective.model
32
+ ? `Uses the default model (${effective.model.displayName}).`
33
+ : 'No default model selected yet — set one in the AI Assistant card above.' })), hasModels && effective.missingCapabilities.length > 0 && (_jsxs("p", { className: "text-warning mt-1.5 flex items-start gap-1.5 text-sm", role: "status", children: [_jsx(AlertTriangle, { size: 14, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), "This model can't do", ' ', effective.missingCapabilities.map(capabilityLabel).join(', '), ", which this feature needs. Pick a compatible model."] }))] }))] }));
13
34
  }
14
35
  //# sourceMappingURL=AiFeaturesCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiFeaturesCard.js","sourceRoot":"","sources":["../../../src/views/settings/AiFeaturesCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGnD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,OAAO,EACP,QAAQ,GAKT;IACC,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IACzB,OAAO,CACL,sCAA0B,SAAS,EAAE,SAAS,EAAC,6CAA6C,aAC1F,aAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAC,4CAA4C,4BAEpE,EACL,YAAG,SAAS,EAAC,oCAAoC,8EAE7C,EAEH,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,YAAG,SAAS,EAAC,+BAA+B,8CAAkC,CAC/E,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,WAAW,YACvB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnB,KAAC,iBAAiB,IAEhB,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,WAAW,EAAE,CAAC,CAAC,WAAW,EAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,EAClB,QAAQ,EAAE,CAAC,OAAO,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAL9B,CAAC,CAAC,GAAG,CAMV,CACH,CAAC,GACE,CACP,IACO,CACX,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"AiFeaturesCard.js","sourceRoot":"","sources":["../../../src/views/settings/AiFeaturesCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { BrandVoiceForm } from './useAiSettings.js';
2
+ /**
3
+ * Brand voice — a reusable description of how generated copy should sound. When
4
+ * enabled, it is injected into the system prompt of content-generation features
5
+ * (co-author, SEO titles/descriptions) so every AI surface writes on-brand.
6
+ */
7
+ export declare function BrandVoiceCard({ value, canEdit, onChange, }: {
8
+ value: BrandVoiceForm;
9
+ canEdit: boolean;
10
+ onChange: (patch: Partial<BrandVoiceForm>) => void;
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=BrandVoiceCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandVoiceCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/BrandVoiceCard.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAWxD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAA;CACnD,2CA0HA"}
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Sparkles } from 'lucide-react';
4
+ import { useId } from 'react';
5
+ import { SettingsToggleRow } from './components.js';
6
+ const INPUT_CLASS = 'w-full rounded-md border border-border bg-input-background px-3 py-2 text-base text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-60';
7
+ const TEXTAREA_CLASS = `${INPUT_CLASS} min-h-[88px] resize-y`;
8
+ const LABEL_CLASS = 'mb-1 block text-sm font-medium text-foreground';
9
+ const TONE_MAX = 400;
10
+ const GUIDELINES_MAX = 2000;
11
+ const SAMPLE_MAX = 2000;
12
+ /**
13
+ * Brand voice — a reusable description of how generated copy should sound. When
14
+ * enabled, it is injected into the system prompt of content-generation features
15
+ * (co-author, SEO titles/descriptions) so every AI surface writes on-brand.
16
+ */
17
+ export function BrandVoiceCard({ value, canEdit, onChange, }) {
18
+ const headingId = useId();
19
+ const nameId = useId();
20
+ const toneId = useId();
21
+ const audienceId = useId();
22
+ const guidelinesId = useId();
23
+ const sampleId = useId();
24
+ const disabled = !canEdit;
25
+ return (_jsxs("section", { "aria-labelledby": headingId, className: "border-border bg-card rounded-lg border p-4", children: [_jsxs("div", { className: "mb-4 flex items-center gap-2", children: [_jsx("span", { className: "bg-brand/10 text-brand flex h-9 w-9 items-center justify-center rounded-lg", children: _jsx(Sparkles, { size: 18, "aria-hidden": "true" }) }), _jsxs("div", { children: [_jsx("h3", { id: headingId, className: "text-foreground text-base font-medium", children: "Brand voice" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Teach the AI how your brand sounds. Applied to content writing and SEO copy." })] })] }), _jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Apply brand voice", description: "When on, generated copy follows the tone and guidelines below.", checked: value.enabled, disabled: disabled, onChange: (v) => onChange({ enabled: v }) }), _jsxs("div", { className: "border-border space-y-4 border-t pt-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: nameId, className: LABEL_CLASS, children: "Name" }), _jsx("input", { id: nameId, type: "text", value: value.name, disabled: disabled, placeholder: "e.g. Acme Marketing", onChange: (e) => onChange({ name: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: toneId, className: LABEL_CLASS, children: "Tone" }), _jsx("input", { id: toneId, type: "text", value: value.tone, disabled: disabled, maxLength: TONE_MAX, placeholder: "e.g. confident, warm, plain-spoken", onChange: (e) => onChange({ tone: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: audienceId, className: LABEL_CLASS, children: ["Audience ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("input", { id: audienceId, type: "text", value: value.audience, disabled: disabled, placeholder: "e.g. busy IT directors at mid-market SaaS companies", onChange: (e) => onChange({ audience: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: guidelinesId, className: LABEL_CLASS, children: ["Guidelines ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("textarea", { id: guidelinesId, value: value.guidelines, disabled: disabled, maxLength: GUIDELINES_MAX, placeholder: 'Do: lead with the benefit, use active voice.\nDon\u2019t: use jargon, exclamation points, or hype.', onChange: (e) => onChange({ guidelines: e.target.value }), className: TEXTAREA_CLASS }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [value.guidelines.length, "/", GUIDELINES_MAX] })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: sampleId, className: LABEL_CLASS, children: ["Sample copy ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("textarea", { id: sampleId, value: value.sampleText, disabled: disabled, maxLength: SAMPLE_MAX, placeholder: "Paste a paragraph of on-brand copy the AI can pattern-match against.", onChange: (e) => onChange({ sampleText: e.target.value }), className: TEXTAREA_CLASS }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [value.sampleText.length, "/", SAMPLE_MAX] })] })] })] })] }));
26
+ }
27
+ //# sourceMappingURL=BrandVoiceCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandVoiceCard.js","sourceRoot":"","sources":["../../../src/views/settings/BrandVoiceCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Client-side, display-only feature → model resolution.
3
+ *
4
+ * Mirrors a simplified version of cms-core's `resolveFeatureModel` so the UI can
5
+ * preview which model a feature will use as the admin edits — including before
6
+ * Save. The server resolver remains the authority for the AI runtime; this only
7
+ * drives labels and capability warnings.
8
+ */
9
+ import type { AiModelView } from './useAiSettings.js';
10
+ export declare function findModel(models: AiModelView[], id: string | undefined): AiModelView | undefined;
11
+ /** Required capabilities a model is missing. Unknown capability strings are ignored. */
12
+ export declare function missingCapabilities(model: AiModelView | undefined, required: string[]): string[];
13
+ export declare function capabilityLabel(key: string): string;
14
+ export interface EffectiveFeatureModel {
15
+ /** The id that will be used (override, else the global default). */
16
+ modelId: string;
17
+ model?: AiModelView;
18
+ /** True when the feature has its own model override (not the default). */
19
+ isOverride: boolean;
20
+ missingCapabilities: string[];
21
+ }
22
+ export declare function effectiveFeatureModel(override: string | undefined, defaultModelId: string, required: string[], models: AiModelView[]): EffectiveFeatureModel;
23
+ /** Whether a model satisfies every required capability and is selectable. */
24
+ export declare function isModelCompatible(model: AiModelView, required: string[]): boolean;
25
+ //# sourceMappingURL=featureModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureModel.d.ts","sourceRoot":"","sources":["../../../src/views/settings/featureModel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAcrD,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAGhG;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAIhG;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAA;IACnB,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,WAAW,EAAE,GACpB,qBAAqB,CAKvB;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Client-side, display-only feature → model resolution.
3
+ *
4
+ * Mirrors a simplified version of cms-core's `resolveFeatureModel` so the UI can
5
+ * preview which model a feature will use as the admin edits — including before
6
+ * Save. The server resolver remains the authority for the AI runtime; this only
7
+ * drives labels and capability warnings.
8
+ */
9
+ const CAPABILITY_LABELS = {
10
+ text: 'text',
11
+ vision: 'vision',
12
+ imageGeneration: 'image generation',
13
+ embeddings: 'embeddings',
14
+ toolCalling: 'tool calling',
15
+ structuredOutput: 'structured output',
16
+ streaming: 'streaming',
17
+ reasoning: 'reasoning',
18
+ longContext: 'long context',
19
+ };
20
+ export function findModel(models, id) {
21
+ if (!id)
22
+ return undefined;
23
+ return models.find((m) => m.id === id || m.providerModelId === id);
24
+ }
25
+ /** Required capabilities a model is missing. Unknown capability strings are ignored. */
26
+ export function missingCapabilities(model, required) {
27
+ const wanted = required.filter((c) => c in CAPABILITY_LABELS);
28
+ if (!model)
29
+ return wanted;
30
+ return wanted.filter((c) => !model.capabilities?.[c]);
31
+ }
32
+ export function capabilityLabel(key) {
33
+ return CAPABILITY_LABELS[key] ?? key;
34
+ }
35
+ export function effectiveFeatureModel(override, defaultModelId, required, models) {
36
+ const isOverride = Boolean(override);
37
+ const modelId = override || defaultModelId;
38
+ const model = findModel(models, modelId);
39
+ return { modelId, model, isOverride, missingCapabilities: missingCapabilities(model, required) };
40
+ }
41
+ /** Whether a model satisfies every required capability and is selectable. */
42
+ export function isModelCompatible(model, required) {
43
+ return model.status !== 'unavailable' && missingCapabilities(model, required).length === 0;
44
+ }
45
+ //# sourceMappingURL=featureModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureModel.js","sourceRoot":"","sources":["../../../src/views/settings/featureModel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,iBAAiB,GAA2B;IAChD,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,eAAe,EAAE,kBAAkB;IACnC,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,mBAAmB;IACrC,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,cAAc;CAC5B,CAAA;AAED,MAAM,UAAU,SAAS,CAAC,MAAqB,EAAE,EAAsB;IACrE,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAA;IACzB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,eAAe,KAAK,EAAE,CAAC,CAAA;AACpE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,mBAAmB,CAAC,KAA8B,EAAE,QAAkB;IACpF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAA;IAC7D,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAA;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAA;AACtC,CAAC;AAWD,MAAM,UAAU,qBAAqB,CACnC,QAA4B,EAC5B,cAAsB,EACtB,QAAkB,EAClB,MAAqB;IAErB,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,QAAQ,IAAI,cAAc,CAAA;IAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAA;AAClG,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,QAAkB;IACtE,OAAO,KAAK,CAAC,MAAM,KAAK,aAAa,IAAI,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;AAC5F,CAAC"}
@@ -61,6 +61,10 @@ export interface AiFeatureView {
61
61
  enabled: boolean;
62
62
  category: string;
63
63
  requiredCapabilities: string[];
64
+ /** Per-feature model override (`provider:modelId`). Empty = use the default. */
65
+ modelId?: string;
66
+ /** Per-feature provider connection override. Usually derived from the model. */
67
+ providerId?: string;
64
68
  }
65
69
  export interface AiUsageView {
66
70
  totalTokens: number;
@@ -72,12 +76,22 @@ export interface AiUsageView {
72
76
  periodEnd: string;
73
77
  runCount: number;
74
78
  }
79
+ /** Editable brand voice fields (the buffered Save-bar portion). */
80
+ export interface BrandVoiceForm {
81
+ enabled: boolean;
82
+ name: string;
83
+ tone: string;
84
+ audience: string;
85
+ guidelines: string;
86
+ sampleText: string;
87
+ }
75
88
  /** The buffered (Save-bar) portion of AI settings. */
76
89
  export interface AiSettingsForm {
77
90
  defaultProviderId: string;
78
91
  defaultModelId: string;
79
92
  features: AiFeatureView[];
80
93
  monthlyTokenLimit: string;
94
+ brandVoice: BrandVoiceForm;
81
95
  }
82
96
  type SaveState = 'idle' | 'saving' | 'success' | 'error';
83
97
  export interface ProviderInput {
@@ -102,6 +116,10 @@ export interface UseAiSettings {
102
116
  setDefaultModel: (id: string) => void;
103
117
  setMonthlyTokenLimit: (value: string) => void;
104
118
  toggleFeature: (key: string, enabled: boolean) => void;
119
+ /** Set a per-feature model override. Empty string reverts to the default model. */
120
+ setFeatureModel: (key: string, modelId: string) => void;
121
+ /** Patch one or more brand voice fields. */
122
+ setBrandVoice: (patch: Partial<BrandVoiceForm>) => void;
105
123
  dirty: boolean;
106
124
  budgetError: string | null;
107
125
  saveState: SaveState;
@@ -1 +1 @@
1
- {"version":3,"file":"useAiSettings.d.ts","sourceRoot":"","sources":["../../../src/views/settings/useAiSettings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAiSettings.d.ts","sourceRoot":"","sources":["../../../src/views/settings/useAiSettings.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,34 @@
1
1
  'use client';
2
2
  import { useCallback, useEffect, useMemo, useState } from 'react';
3
3
  import { cmsApi } from '../../lib/api.js';
4
+ const EMPTY_BRAND_VOICE = {
5
+ enabled: false,
6
+ name: '',
7
+ tone: '',
8
+ audience: '',
9
+ guidelines: '',
10
+ sampleText: '',
11
+ };
4
12
  function formFromResponse(res) {
5
13
  return {
6
14
  defaultProviderId: res.settings.defaultProviderId ?? '',
7
15
  defaultModelId: res.settings.defaultModelId ?? '',
8
- features: res.settings.features.map((f) => ({ ...f })),
16
+ features: res.settings.features.map((f) => ({
17
+ ...f,
18
+ modelId: f.modelId ?? '',
19
+ providerId: f.providerId ?? '',
20
+ })),
9
21
  monthlyTokenLimit: typeof res.settings.budget.monthlyTokenLimit === 'number'
10
22
  ? String(res.settings.budget.monthlyTokenLimit)
11
23
  : '',
24
+ brandVoice: {
25
+ enabled: res.settings.brandVoice?.enabled ?? false,
26
+ name: res.settings.brandVoice?.name ?? '',
27
+ tone: res.settings.brandVoice?.tone ?? '',
28
+ audience: res.settings.brandVoice?.audience ?? '',
29
+ guidelines: res.settings.brandVoice?.guidelines ?? '',
30
+ sampleText: res.settings.brandVoice?.sampleText ?? '',
31
+ },
12
32
  };
13
33
  }
14
34
  const EMPTY_FORM = {
@@ -16,7 +36,17 @@ const EMPTY_FORM = {
16
36
  defaultModelId: '',
17
37
  features: [],
18
38
  monthlyTokenLimit: '',
39
+ brandVoice: { ...EMPTY_BRAND_VOICE },
19
40
  };
41
+ /** A brand voice with no content and disabled clears the stored profile (send null). */
42
+ function brandVoiceIsEmpty(bv) {
43
+ return (!bv.enabled &&
44
+ !bv.name.trim() &&
45
+ !bv.tone.trim() &&
46
+ !bv.audience.trim() &&
47
+ !bv.guidelines.trim() &&
48
+ !bv.sampleText.trim());
49
+ }
20
50
  export function useAiSettings(canEdit) {
21
51
  const [loading, setLoading] = useState(true);
22
52
  const [loadError, setLoadError] = useState(null);
@@ -94,6 +124,17 @@ export function useAiSettings(canEdit) {
94
124
  }));
95
125
  setSaveState('idle');
96
126
  }, []);
127
+ const setFeatureModel = useCallback((key, modelId) => {
128
+ setForm((prev) => ({
129
+ ...prev,
130
+ features: prev.features.map((f) => f.key === key ? { ...f, modelId, providerId: modelId ? f.providerId : '' } : f),
131
+ }));
132
+ setSaveState('idle');
133
+ }, []);
134
+ const setBrandVoice = useCallback((patch) => {
135
+ setForm((prev) => ({ ...prev, brandVoice: { ...prev.brandVoice, ...patch } }));
136
+ setSaveState('idle');
137
+ }, []);
97
138
  const budgetError = useMemo(() => {
98
139
  if (form.monthlyTokenLimit === '')
99
140
  return null;
@@ -111,7 +152,20 @@ export function useAiSettings(canEdit) {
111
152
  return true;
112
153
  if (form.features.length !== baseline.features.length)
113
154
  return true;
114
- return form.features.some((f, i) => f.enabled !== baseline.features[i]?.enabled);
155
+ const bvKeys = [
156
+ 'enabled',
157
+ 'name',
158
+ 'tone',
159
+ 'audience',
160
+ 'guidelines',
161
+ 'sampleText',
162
+ ];
163
+ if (bvKeys.some((k) => form.brandVoice[k] !== baseline.brandVoice[k]))
164
+ return true;
165
+ return form.features.some((f, i) => {
166
+ const base = baseline.features[i];
167
+ return f.enabled !== base?.enabled || (f.modelId ?? '') !== (base?.modelId ?? '');
168
+ });
115
169
  }, [form, baseline]);
116
170
  const save = useCallback(async () => {
117
171
  if (!canEdit || budgetError)
@@ -124,10 +178,24 @@ export function useAiSettings(canEdit) {
124
178
  body: JSON.stringify({
125
179
  defaultProviderId: form.defaultProviderId || null,
126
180
  defaultModelId: form.defaultModelId || null,
127
- features: form.features.map((f) => ({ key: f.key, enabled: f.enabled })),
181
+ features: form.features.map((f) => ({
182
+ key: f.key,
183
+ enabled: f.enabled,
184
+ modelId: f.modelId ? f.modelId : null,
185
+ })),
128
186
  budget: {
129
187
  monthlyTokenLimit: form.monthlyTokenLimit === '' ? null : Number(form.monthlyTokenLimit),
130
188
  },
189
+ brandVoice: brandVoiceIsEmpty(form.brandVoice)
190
+ ? null
191
+ : {
192
+ enabled: form.brandVoice.enabled,
193
+ name: form.brandVoice.name,
194
+ tone: form.brandVoice.tone,
195
+ audience: form.brandVoice.audience,
196
+ guidelines: form.brandVoice.guidelines,
197
+ sampleText: form.brandVoice.sampleText,
198
+ },
131
199
  }),
132
200
  });
133
201
  if (res.error)
@@ -260,6 +328,8 @@ export function useAiSettings(canEdit) {
260
328
  setDefaultModel: setDefaultModelId,
261
329
  setMonthlyTokenLimit,
262
330
  toggleFeature,
331
+ setFeatureModel,
332
+ setBrandVoice,
263
333
  dirty,
264
334
  budgetError,
265
335
  saveState,
@@ -1 +1 @@
1
- {"version":3,"file":"useAiSettings.js","sourceRoot":"","sources":["../../../src/views/settings/useAiSettings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAiSettings.js","sourceRoot":"","sources":["../../../src/views/settings/useAiSettings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-admin",
3
- "version": "0.34.0",
3
+ "version": "0.36.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/actuate-media/actuatecms.git",
@@ -88,7 +88,7 @@
88
88
  "tailwindcss": "^4.0.0",
89
89
  "typescript": "^5.7.0",
90
90
  "vitest": "^4.1.0",
91
- "@actuate-media/cms-core": "0.43.0",
91
+ "@actuate-media/cms-core": "0.46.0",
92
92
  "@actuate-media/component-blocks": "0.2.0"
93
93
  },
94
94
  "scripts": {
@@ -65,6 +65,20 @@ const MODELS = [
65
65
  lastSyncedAt: '2026-01-01T00:00:00.000Z',
66
66
  source: 'config',
67
67
  },
68
+ {
69
+ id: 'anthropic:claude-haiku',
70
+ provider: 'anthropic',
71
+ providerModelId: 'claude-haiku',
72
+ displayName: 'Claude Haiku (fast)',
73
+ status: 'available',
74
+ capabilities: { text: true },
75
+ contextWindow: 200000,
76
+ inputModalities: ['text'],
77
+ outputModalities: ['text'],
78
+ pricing: { inputPerMillion: 0.8, outputPerMillion: 4 },
79
+ lastSyncedAt: '2026-01-01T00:00:00.000Z',
80
+ source: 'config',
81
+ },
68
82
  ]
69
83
 
70
84
  const USAGE = {
@@ -191,6 +205,89 @@ describe('AISettingsTab', () => {
191
205
  expect(cw.enabled).toBe(false)
192
206
  })
193
207
 
208
+ it('routes a feature to a specific model and persists the override', async () => {
209
+ render(<AISettingsTab role="ADMIN" />)
210
+ await screen.findByText('AI Features')
211
+
212
+ // Only the enabled content-writing feature exposes a per-feature Model select.
213
+ const featuresRegion = screen.getByRole('region', { name: 'AI Features' })
214
+ const select = within(featuresRegion).getByLabelText('Model') as HTMLSelectElement
215
+ expect(select.value).toBe('') // inherits the default
216
+
217
+ fireEvent.change(select, { target: { value: 'anthropic:claude-haiku' } })
218
+
219
+ const save = screen.getByRole('button', { name: 'Save Changes' }) as HTMLButtonElement
220
+ expect(save.disabled).toBe(false)
221
+ fireEvent.click(save)
222
+
223
+ await waitFor(() =>
224
+ expect(cmsApi).toHaveBeenCalledWith(
225
+ '/ai/settings',
226
+ expect.objectContaining({ method: 'PUT' }),
227
+ ),
228
+ )
229
+ const putCall = cmsApi.mock.calls.find(
230
+ ([e, o]) => e === '/ai/settings' && (o as { method?: string })?.method === 'PUT',
231
+ )
232
+ const body = JSON.parse((putCall![1] as { body: string }).body)
233
+ const cw = body.features.find((f: { key: string }) => f.key === 'ai.features.contentWriting')
234
+ expect(cw.modelId).toBe('anthropic:claude-haiku')
235
+ })
236
+
237
+ it('warns when a feature would run on a model missing a required capability', async () => {
238
+ settingsResponse = deepClone(SETTINGS_RESPONSE)
239
+ // Alt-text needs vision; route it through the text-only Haiku model.
240
+ settingsResponse.settings.features.push({
241
+ key: 'ai.features.mediaAltText',
242
+ label: 'Auto alt-text for media',
243
+ description: 'Generate alt text for images.',
244
+ enabled: true,
245
+ category: 'media',
246
+ requiredCapabilities: ['vision'],
247
+ modelId: 'anthropic:claude-haiku',
248
+ } as (typeof SETTINGS_RESPONSE)['settings']['features'][number])
249
+
250
+ render(<AISettingsTab role="ADMIN" />)
251
+ await screen.findByText('AI Features')
252
+ expect(await screen.findByText(/can't do vision/i)).toBeTruthy()
253
+ })
254
+
255
+ it('edits the brand voice and persists it to /ai/settings', async () => {
256
+ render(<AISettingsTab role="ADMIN" />)
257
+ const region = await screen.findByRole('region', { name: 'Brand voice' })
258
+
259
+ fireEvent.click(within(region).getByRole('switch', { name: 'Apply brand voice' }))
260
+ fireEvent.change(within(region).getByLabelText('Tone'), {
261
+ target: { value: 'confident, warm' },
262
+ })
263
+
264
+ const save = screen.getByRole('button', { name: 'Save Changes' }) as HTMLButtonElement
265
+ expect(save.disabled).toBe(false)
266
+ fireEvent.click(save)
267
+
268
+ await waitFor(() =>
269
+ expect(cmsApi).toHaveBeenCalledWith(
270
+ '/ai/settings',
271
+ expect.objectContaining({ method: 'PUT' }),
272
+ ),
273
+ )
274
+ const putCall = cmsApi.mock.calls.find(
275
+ ([e, o]) => e === '/ai/settings' && (o as { method?: string })?.method === 'PUT',
276
+ )
277
+ const body = JSON.parse((putCall![1] as { body: string }).body)
278
+ expect(body.brandVoice).toMatchObject({ enabled: true, tone: 'confident, warm' })
279
+ })
280
+
281
+ it('disables brand voice fields for non-admins', async () => {
282
+ render(<AISettingsTab role="EDITOR" />)
283
+ const region = await screen.findByRole('region', { name: 'Brand voice' })
284
+ expect(
285
+ (within(region).getByRole('switch', { name: 'Apply brand voice' }) as HTMLButtonElement)
286
+ .disabled,
287
+ ).toBe(true)
288
+ expect((within(region).getByLabelText('Tone') as HTMLInputElement).disabled).toBe(true)
289
+ })
290
+
194
291
  it('is read-only for non-admins', async () => {
195
292
  render(<AISettingsTab role="EDITOR" />)
196
293
  expect(await screen.findByText(/read-only access to AI settings/i)).toBeTruthy()
@@ -4,6 +4,7 @@ import { AlertTriangle, Bot, Info, Loader2, Plus } from 'lucide-react'
4
4
  import { useId, useMemo, useState } from 'react'
5
5
  import { toast } from 'sonner'
6
6
  import { AiFeaturesCard } from './AiFeaturesCard.js'
7
+ import { BrandVoiceCard } from './BrandVoiceCard.js'
7
8
  import { ModelSelector } from './ModelSelector.js'
8
9
  import { MonthlyUsageCard } from './MonthlyUsageCard.js'
9
10
  import { ProviderConnectionCard } from './ProviderConnectionCard.js'
@@ -80,7 +81,15 @@ export function AISettingsTab({ role }: AISettingsTabProps) {
80
81
 
81
82
  <AssistantCard ai={ai} canEdit={canEdit} />
82
83
  <ProviderConnectionsSection ai={ai} canEdit={canEdit} />
83
- <AiFeaturesCard features={ai.form.features} canEdit={canEdit} onToggle={ai.toggleFeature} />
84
+ <AiFeaturesCard
85
+ features={ai.form.features}
86
+ models={ai.models}
87
+ defaultModelId={ai.form.defaultModelId}
88
+ canEdit={canEdit}
89
+ onToggle={ai.toggleFeature}
90
+ onSetFeatureModel={ai.setFeatureModel}
91
+ />
92
+ <BrandVoiceCard value={ai.form.brandVoice} canEdit={canEdit} onChange={ai.setBrandVoice} />
84
93
  <MonthlyUsageCard
85
94
  usage={ai.usage}
86
95
  monthlyTokenLimit={ai.form.monthlyTokenLimit}