@mj-biz-apps/marketing-actions 0.3.0 → 0.4.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 (53) hide show
  1. package/dist/__tests__/approveProgramOperation.test.js +2 -3
  2. package/dist/__tests__/approveProgramOperation.test.js.map +1 -1
  3. package/dist/__tests__/generateAdImage.test.d.ts +2 -0
  4. package/dist/__tests__/generateAdImage.test.d.ts.map +1 -0
  5. package/dist/__tests__/generateAdImage.test.js +90 -0
  6. package/dist/__tests__/generateAdImage.test.js.map +1 -0
  7. package/dist/__tests__/scaleAdLevers.test.d.ts +2 -0
  8. package/dist/__tests__/scaleAdLevers.test.d.ts.map +1 -0
  9. package/dist/__tests__/scaleAdLevers.test.js +15 -0
  10. package/dist/__tests__/scaleAdLevers.test.js.map +1 -0
  11. package/dist/business/GenerateAdImageAction.d.ts +43 -0
  12. package/dist/business/GenerateAdImageAction.d.ts.map +1 -0
  13. package/dist/business/GenerateAdImageAction.js +154 -0
  14. package/dist/business/GenerateAdImageAction.js.map +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +8 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/operations/ProgramOperations.d.ts +2 -0
  19. package/dist/operations/ProgramOperations.d.ts.map +1 -1
  20. package/dist/operations/ProgramOperations.js +31 -13
  21. package/dist/operations/ProgramOperations.js.map +1 -1
  22. package/dist/reads/GetProgramContextAction.d.ts.map +1 -1
  23. package/dist/reads/GetProgramContextAction.js +25 -7
  24. package/dist/reads/GetProgramContextAction.js.map +1 -1
  25. package/dist/reads/ListAdAccountAudiencesAction.d.ts +17 -0
  26. package/dist/reads/ListAdAccountAudiencesAction.d.ts.map +1 -0
  27. package/dist/reads/ListAdAccountAudiencesAction.js +71 -0
  28. package/dist/reads/ListAdAccountAudiencesAction.js.map +1 -0
  29. package/dist/reads/PreCheckProgramAction.d.ts.map +1 -1
  30. package/dist/reads/PreCheckProgramAction.js +6 -2
  31. package/dist/reads/PreCheckProgramAction.js.map +1 -1
  32. package/dist/writes/CheckEarlyServingAction.d.ts +28 -0
  33. package/dist/writes/CheckEarlyServingAction.d.ts.map +1 -0
  34. package/dist/writes/CheckEarlyServingAction.js +181 -0
  35. package/dist/writes/CheckEarlyServingAction.js.map +1 -0
  36. package/dist/writes/ConnectBrandCredentialAction.d.ts.map +1 -1
  37. package/dist/writes/ConnectBrandCredentialAction.js +41 -2
  38. package/dist/writes/ConnectBrandCredentialAction.js.map +1 -1
  39. package/dist/writes/LockProgramAction.d.ts.map +1 -1
  40. package/dist/writes/LockProgramAction.js +22 -3
  41. package/dist/writes/LockProgramAction.js.map +1 -1
  42. package/dist/writes/ProposeProgramAction.d.ts.map +1 -1
  43. package/dist/writes/ProposeProgramAction.js +17 -2
  44. package/dist/writes/ProposeProgramAction.js.map +1 -1
  45. package/dist/writes/ResumeProgramAction.d.ts +17 -0
  46. package/dist/writes/ResumeProgramAction.d.ts.map +1 -0
  47. package/dist/writes/ResumeProgramAction.js +86 -0
  48. package/dist/writes/ResumeProgramAction.js.map +1 -0
  49. package/dist/writes/ScaleProgramAction.d.ts +2 -0
  50. package/dist/writes/ScaleProgramAction.d.ts.map +1 -1
  51. package/dist/writes/ScaleProgramAction.js +19 -0
  52. package/dist/writes/ScaleProgramAction.js.map +1 -1
  53. package/package.json +5 -5
@@ -51,13 +51,12 @@ describe('Marketing.ApproveProgram scheduling order (KI-87)', () => {
51
51
  expect(out.ScheduledInto?.SprintNumber).toBe(9);
52
52
  expect(out.PlannedSprint).toBeNull();
53
53
  });
54
- it('no sprint in Planning: plans WITHOUT starting, locks into it, THEN starts it', async () => {
54
+ it('no sprint in Planning: plans WITHOUT starting, then locks into it — the lock applies the clock, never this handler (D-28)', async () => {
55
55
  results.set('Lock Program', [refused('NO_PLANNED_SPRINT'), lockOk(1)]);
56
56
  results.set('Plan Next Sprint', [ok({ SprintNumber: 1, StartDate: '2026-09-29T15:00:00.000Z', EndDate: '2026-10-13T15:00:00.000Z' })]);
57
57
  const out = await new Harness().run({ BrandID: BRAND, ProgramID: PROGRAM }, provider, USER);
58
- expect(calls.map(c => c.action)).toEqual(['Lock Program', 'Plan Next Sprint', 'Lock Program', 'Start Due Sprints']);
58
+ expect(calls.map(c => c.action)).toEqual(['Lock Program', 'Plan Next Sprint', 'Lock Program']);
59
59
  expect(calls[1].inputs).toMatchObject({ BrandID: BRAND, StartIfIdle: false });
60
- expect(calls[3].inputs).toMatchObject({ BrandID: BRAND });
61
60
  expect(out.Success).toBe(true);
62
61
  expect(out.PlannedSprint).toEqual({ SprintNumber: 1, StartDate: '2026-09-29', EndDate: '2026-10-13' });
63
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"approveProgramOperation.test.js","sourceRoot":"","sources":["../../src/__tests__/approveProgramOperation.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approveProgramOperation.test.js","sourceRoot":"","sources":["../../src/__tests__/approveProgramOperation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generateAdImage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateAdImage.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/generateAdImage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Generate Ad Image (D-29): the brand's rules reach the model, the frame reaches the provider, the verdict reaches
3
+ * the agent, and a provider that cannot store the picture is an honest NO_IMAGE with the operator's reason.
4
+ */
5
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
6
+ const generateImage = vi.fn();
7
+ const roleMock = vi.fn(async () => null);
8
+ vi.mock('@memberjunction/core', async (importOriginal) => {
9
+ const original = await importOriginal();
10
+ class RunViewStub {
11
+ async RunView() { return { Success: true, Results: [{ BrandName: 'Sidecar', VisualIdentityGuidelines: 'Warm editorial photography', BrandDosAndDonts: "Don't: robots" }] }; }
12
+ }
13
+ return { ...original, RunView: RunViewStub };
14
+ });
15
+ vi.mock('@mj-biz-apps/marketing-core', async (importOriginal) => {
16
+ const original = await importOriginal();
17
+ return { ...original, assertMarketingRole: () => roleMock() };
18
+ });
19
+ vi.mock('@memberjunction/aiengine', () => ({
20
+ AIEngine: { Instance: {
21
+ Config: async () => { },
22
+ Models: [{ Name: 'Nano Banana 2', AIModelType: 'Image Generator', IsActive: true, PowerRank: 18, ModelVendors: [{ Status: 'Active', DriverClass: 'GeminiImageGenerator', APIName: 'gemini-3.1-flash-image', Priority: 1, VendorID: 'V-G' }] },
23
+ { Name: 'Nano Banana Pro', AIModelType: 'Image Generator', IsActive: false, PowerRank: 20, ModelVendors: [{ Status: 'Active', DriverClass: 'GeminiImageGenerator', APIName: 'gemini-3-pro-image-preview', Priority: 1, VendorID: 'V-G' }] }],
24
+ Vendors: [{ ID: 'V-G', Name: 'Google' }],
25
+ IsInferenceProvider: () => true,
26
+ } },
27
+ }));
28
+ vi.mock('@mj-biz-apps/marketing-providers', async (importOriginal) => {
29
+ const original = await importOriginal();
30
+ return { ...original, getImageProvider: async () => ({ generateImage }) };
31
+ });
32
+ import { GenerateAdImageAction } from '../business/GenerateAdImageAction.js';
33
+ const BRAND = 'bbbbbbbb-0000-4000-8000-00000000000b';
34
+ const USER = { ID: 'U-1', Email: 'op@example.test' };
35
+ function params(inputs) {
36
+ return {
37
+ Action: { Name: 'Generate Ad Image' }, ContextUser: USER, Filters: [],
38
+ Params: Object.entries(inputs).map(([Name, Value]) => ({ Name, Type: 'Input', Value })),
39
+ };
40
+ }
41
+ const out = (r, name) => r.Params?.find(p => p.Name === name && p.Type === 'Output')?.Value;
42
+ beforeEach(() => { generateImage.mockReset(); });
43
+ describe('Generate Ad Image', () => {
44
+ it('sends the brand rules and the landscape frame to the provider and judges the result', async () => {
45
+ generateImage.mockResolvedValue({ mode: 'generated', url: 'https://cdn.example.com/ad-1.png', prompt: 'p', provider: 'GeminiImage', width: 1536, height: 1024 });
46
+ const r = await new GenerateAdImageAction().Run(params({ BrandID: BRAND, Brief: 'An executive reading a roadmap', Headline: 'Your 2027 AI Roadmap' }));
47
+ expect(r.Success).toBe(true);
48
+ const call = generateImage.mock.calls[0][0];
49
+ expect(call.width).toBe(1536);
50
+ expect(call.height).toBe(1024);
51
+ expect(call.aspectRatio).toBe('16:9');
52
+ expect(call.fileNamePrefix).toBe('ad');
53
+ expect(call.model).toBe('gemini-3.1-flash-image'); // the catalog's ACTIVE Gemini image model, not the inactive Pro
54
+ expect(String(call.prompt)).toContain('No text, lettering');
55
+ expect(String(call.negativePrompt)).toContain('avoid: robots');
56
+ expect(call.style).toBe('Warm editorial photography');
57
+ const images = JSON.parse(String(out(r, 'Images')));
58
+ expect(images).toHaveLength(1);
59
+ expect(images[0].model).toBe('gemini-3.1-flash-image');
60
+ expect(images[0].ok).toBe(true);
61
+ expect(images[0].notes[0]).toMatch(/center-cropped to 1.91:1/);
62
+ });
63
+ it('adapts from a source image when one is supplied, and refuses a non-https source', async () => {
64
+ generateImage.mockResolvedValue({ mode: 'generated', url: 'https://cdn.example.com/ad-2.png', prompt: 'p', provider: 'GeminiImage', width: 1024, height: 1024 });
65
+ const r = await new GenerateAdImageAction().Run(params({ BrandID: BRAND, Brief: 'the Ascend cover', Frame: 'square', SourceImageUrl: 'https://sidecar.ai/hubfs/ascend.png' }));
66
+ expect(r.Success).toBe(true);
67
+ expect(generateImage.mock.calls[0][0].sourceImageUrl).toBe('https://sidecar.ai/hubfs/ascend.png');
68
+ expect(String(generateImage.mock.calls[0][0].prompt)).toMatch(/^Adapt the supplied image/);
69
+ const bad = await new GenerateAdImageAction().Run(params({ BrandID: BRAND, Brief: 'the Ascend cover', SourceImageUrl: 'http://sidecar.ai/x.png' }));
70
+ expect(bad.Success).toBe(false);
71
+ expect(bad.ResultCode).toBe('VALIDATION_ERROR');
72
+ });
73
+ it('a provider that cannot store the picture is NO_IMAGE with the reason verbatim', async () => {
74
+ generateImage.mockResolvedValue({ mode: 'prompt_only', url: '', prompt: 'p', provider: 'GeminiImage', reason: 'the image was generated but could not be stored — no brand HubSpot connection' });
75
+ const r = await new GenerateAdImageAction().Run(params({ BrandID: BRAND, Brief: 'An executive reading a roadmap' }));
76
+ expect(r.Success).toBe(false);
77
+ expect(r.ResultCode).toBe('NO_IMAGE');
78
+ expect(r.Message).toContain('no brand HubSpot connection');
79
+ });
80
+ it('flags a picture the platforms would refuse instead of hiding it', async () => {
81
+ generateImage.mockResolvedValue({ mode: 'generated', url: 'https://cdn.example.com/tiny.png', prompt: 'p', provider: 'GeminiImage', width: 200, height: 133 });
82
+ const r = await new GenerateAdImageAction().Run(params({ BrandID: BRAND, Brief: 'An executive reading a roadmap' }));
83
+ expect(r.Success).toBe(true);
84
+ const images = JSON.parse(String(out(r, 'Images')));
85
+ expect(images[0].ok).toBe(false);
86
+ expect(images[0].notes[0]).toMatch(/below the platforms' minimum width/);
87
+ expect(r.Message).toContain('1 flagged');
88
+ });
89
+ });
90
+ //# sourceMappingURL=generateAdImage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateAdImage.test.js","sourceRoot":"","sources":["../../src/__tests__/generateAdImage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scaleAdLevers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaleAdLevers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scaleAdLevers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { scaleAdLevers } from '../writes/ScaleProgramAction.js';
3
+ describe('scaleAdLevers (D-32)', () => {
4
+ it('multiplies the daily budget to the cent and keeps every other lever', () => {
5
+ const out = JSON.parse(scaleAdLevers(JSON.stringify({ audience: 'targeted', dailyBudgetUsd: 20, landingPageUrl: 'https://sidecar.ai/ai', audienceTemplate: 'SC | Association Staff' }), 1.5));
6
+ expect(out).toEqual({ audience: 'targeted', dailyBudgetUsd: 30, landingPageUrl: 'https://sidecar.ai/ai', audienceTemplate: 'SC | Association Staff' });
7
+ expect(JSON.parse(scaleAdLevers(JSON.stringify({ dailyBudgetUsd: 33.33 }), 2)).dailyBudgetUsd).toBe(66.66);
8
+ });
9
+ it('passes nothing for a non-ad program and leaves unparseable levers to Propose', () => {
10
+ expect(scaleAdLevers(null, 2)).toBeNull();
11
+ expect(scaleAdLevers(' ', 2)).toBeNull();
12
+ expect(scaleAdLevers('{not json', 2)).toBe('{not json');
13
+ });
14
+ });
15
+ //# sourceMappingURL=scaleAdLevers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaleAdLevers.test.js","sourceRoot":"","sources":["../../src/__tests__/scaleAdLevers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,CAAC,EAAE,GAAG,CAAE,CAAC,CAAC;QAC/L,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACvJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAE,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACpF,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Generate Ad Image (D-29) — the Creative Agent's hands. Makes (or adapts) a picture for an ad, under the brand's
3
+ * visual rules, hosts it where the brand's images live, and judges it against the platforms' frame before anyone
4
+ * sees it. The judgment about WHAT the picture shows is the agent's (its prompt); everything that must be true of
5
+ * every ad image — no text in the picture, the frame, the minimum size, the brand's don'ts — is enforced here.
6
+ *
7
+ * Hosting is the content pipeline's rule (KI-44): the brand's HubSpot file manager, else MJ file storage. When
8
+ * neither can store the picture the result is NO_IMAGE with the operator's fix named verbatim — never a URL that
9
+ * expires before lock.
10
+ */
11
+ import { ActionResultSimple, RunActionParams, ActionParam } from "@memberjunction/actions-base";
12
+ import { MarketingBaseAction } from "../MarketingBaseAction.js";
13
+ import { RoleTier } from "@mj-biz-apps/marketing-core";
14
+ /** One candidate the agent can choose from. */
15
+ export interface GeneratedAdImage {
16
+ url: string;
17
+ /** The vendor model that made it (the catalog's choice), or null for the provider's default. */
18
+ model: string | null;
19
+ width: number | null;
20
+ height: number | null;
21
+ /** Platform verdict: notes a person should know (a crop, a shortfall). `ok=false` means the platforms would refuse it. */
22
+ ok: boolean;
23
+ notes: string[];
24
+ prompt: string;
25
+ }
26
+ export declare class GenerateAdImageAction extends MarketingBaseAction {
27
+ protected get RequiredRole(): RoleTier;
28
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
29
+ /**
30
+ * The host's catalog decides which image model makes ad pictures — MJ's rule (the core Generate Image action reads
31
+ * the same catalog): the active 'Image Generator' model with the highest PowerRank whose active inference vendor is
32
+ * driven by the Gemini image generator (the provider this app ships), by its API name. An admin switches models by
33
+ * activating a catalog row (Nano Banana 2 over Pro, say), never by a code change. No active Gemini image model in
34
+ * the catalog ⇒ the provider's default, said in the log, never a refusal.
35
+ */
36
+ private catalogImageModel;
37
+ private loadBrand;
38
+ get Params(): ActionParam[];
39
+ get Description(): string;
40
+ }
41
+ /** Anti-tree-shaking anchor. */
42
+ export declare function LoadGenerateAdImageAction(): void;
43
+ //# sourceMappingURL=GenerateAdImageAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerateAdImageAction.d.ts","sourceRoot":"","sources":["../../src/business/GenerateAdImageAction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhG,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAmB,QAAQ,EAA+G,MAAM,6BAA6B,CAAC;AAQrL,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,gGAAgG;IAChG,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0HAA0H;IAC1H,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,qBACa,qBAAsB,SAAQ,mBAAmB;IAC1D,cAAuB,YAAY,IAAI,QAAQ,CAAuB;cAEtD,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgEvF;;;;;;OAMG;YACW,iBAAiB;YAwBjB,SAAS;IASvB,IAAW,MAAM,IAAI,WAAW,EAAE,CAajC;IAED,IAAW,WAAW,IAAI,MAAM,CAE/B;CACJ;AAED,gCAAgC;AAChC,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -0,0 +1,154 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseAction } from "@memberjunction/actions";
8
+ import { MarketingBaseAction } from "../MarketingBaseAction.js";
9
+ import { AD_IMAGE_FRAMES, composeAdImagePrompt, getTypedParam, isAdImageFrame, judgeAdImage, toMarketingEntityName } from "@mj-biz-apps/marketing-core";
10
+ import { getImageProvider } from "@mj-biz-apps/marketing-providers";
11
+ import { RegisterClass, UUIDsEqual } from "@memberjunction/global";
12
+ import { LogError, LogStatus, RunView } from "@memberjunction/core";
13
+ import { AIEngine } from "@memberjunction/aiengine";
14
+ import { z } from 'zod';
15
+ let GenerateAdImageAction = class GenerateAdImageAction extends MarketingBaseAction {
16
+ get RequiredRole() { return 'Operator'; }
17
+ async InternalRunAction(params) {
18
+ if (!params.ContextUser) {
19
+ return { Success: false, Message: 'ContextUser is required', ResultCode: 'VALIDATION_ERROR' };
20
+ }
21
+ let brandId, brief, frame, headline, primaryText, sourceImageUrl, styleOverride, count;
22
+ try {
23
+ brandId = getTypedParam(params, 'BrandID', z.string().uuid());
24
+ brief = getTypedParam(params, 'Brief', z.string().min(8).max(2000));
25
+ const rawFrame = getTypedParam(params, 'Frame', z.string().nullish()) ?? 'landscape';
26
+ if (!isAdImageFrame(rawFrame))
27
+ throw new Error(`Frame must be 'landscape' or 'square' (got "${rawFrame}").`);
28
+ frame = rawFrame;
29
+ headline = getTypedParam(params, 'Headline', z.string().max(200).nullish()) ?? null;
30
+ primaryText = getTypedParam(params, 'PrimaryText', z.string().max(1000).nullish()) ?? null;
31
+ sourceImageUrl = getTypedParam(params, 'SourceImageUrl', z.string().url().startsWith('https://').nullish()) ?? null;
32
+ styleOverride = getTypedParam(params, 'StyleOverride', z.string().max(500).nullish()) ?? null;
33
+ count = getTypedParam(params, 'Count', z.coerce.number().int().min(1).max(3).nullish()) ?? 1;
34
+ }
35
+ catch (e) {
36
+ return { Success: false, Message: e instanceof Error ? e.message : 'Validation error', ResultCode: 'VALIDATION_ERROR' };
37
+ }
38
+ try {
39
+ const brand = await this.loadBrand(brandId, params);
40
+ if (!brand)
41
+ return { Success: false, Message: `Brand ${brandId} not found.`, ResultCode: 'NOT_FOUND' };
42
+ const composed = composeAdImagePrompt({
43
+ brief, headline, primaryText, frame, adapt: !!sourceImageUrl, styleOverride,
44
+ brandName: brand.BrandName, visualIdentityGuidelines: brand.VisualIdentityGuidelines, dosAndDonts: brand.BrandDosAndDonts,
45
+ });
46
+ const spec = AD_IMAGE_FRAMES[frame];
47
+ const [w, h] = spec.size.split('x').map(Number);
48
+ const provider = await getImageProvider(brandId, params.ContextUser);
49
+ const model = await this.catalogImageModel(params.ContextUser);
50
+ const images = [];
51
+ let reason = null;
52
+ for (let i = 0; i < count; i++) {
53
+ const r = await provider.generateImage({
54
+ prompt: composed.prompt, style: composed.style ?? undefined, negativePrompt: composed.negativePrompt,
55
+ width: w, height: h, aspectRatio: spec.aspectRatio,
56
+ ...(model ? { model } : {}),
57
+ ...(sourceImageUrl ? { sourceImageUrl } : {}), fileNamePrefix: 'ad',
58
+ });
59
+ if (r.mode !== 'generated' || !r.url) {
60
+ reason = reason ?? r.reason ?? 'the image provider returned no image';
61
+ continue;
62
+ }
63
+ const dims = r.width && r.height ? { width: r.width, height: r.height } : null;
64
+ const verdict = dims ? judgeAdImage(frame, dims) : { ok: true, notes: ['size could not be measured — check the preview'] };
65
+ images.push({ url: r.url, model, width: dims?.width ?? null, height: dims?.height ?? null, ok: verdict.ok, notes: verdict.notes, prompt: r.prompt });
66
+ }
67
+ params.Params.push({ Name: 'Images', Type: 'Output', Value: JSON.stringify(images) });
68
+ params.Params.push({ Name: 'Frame', Type: 'Output', Value: frame });
69
+ if (reason)
70
+ params.Params.push({ Name: 'Reason', Type: 'Output', Value: reason });
71
+ if (images.length === 0) {
72
+ LogError(`GenerateAdImage: no image for brand ${brandId} — ${reason}`);
73
+ return { Success: false, ResultCode: 'NO_IMAGE', Params: params.Params, Message: `No ad image could be produced: ${reason}` };
74
+ }
75
+ const usable = images.filter(i => i.ok).length;
76
+ LogStatus(`GenerateAdImage: ${images.length} ${frame} image(s) for brand ${brandId} via ${model ?? 'the provider default model'} (${usable} pass the platform frame)${sourceImageUrl ? ', adapted from the supplied source' : ''}`);
77
+ return {
78
+ Success: true, ResultCode: images.length < count ? 'PARTIAL' : 'SUCCESS', Params: params.Params,
79
+ Message: `${images.length} ${frame} ad image(s) ready (${usable} pass the platforms' frame${images.length - usable ? `, ${images.length - usable} flagged` : ''}).${reason ? ` ${count - images.length} failed: ${reason}` : ''}`,
80
+ };
81
+ }
82
+ catch (e) {
83
+ const msg = e instanceof Error ? e.message : 'Unexpected error';
84
+ LogError(`GenerateAdImage failed for brand ${brandId}: ${msg}`, undefined, e);
85
+ return { Success: false, Message: msg, ResultCode: 'ERROR' };
86
+ }
87
+ }
88
+ /**
89
+ * The host's catalog decides which image model makes ad pictures — MJ's rule (the core Generate Image action reads
90
+ * the same catalog): the active 'Image Generator' model with the highest PowerRank whose active inference vendor is
91
+ * driven by the Gemini image generator (the provider this app ships), by its API name. An admin switches models by
92
+ * activating a catalog row (Nano Banana 2 over Pro, say), never by a code change. No active Gemini image model in
93
+ * the catalog ⇒ the provider's default, said in the log, never a refusal.
94
+ */
95
+ async catalogImageModel(user) {
96
+ try {
97
+ await AIEngine.Instance.Config(false, user);
98
+ const candidates = AIEngine.Instance.Models
99
+ .filter(m => m.AIModelType?.toLowerCase() === 'image generator' && m.IsActive)
100
+ .sort((a, b) => (b.PowerRank || 0) - (a.PowerRank || 0));
101
+ for (const m of candidates) {
102
+ const vendor = m.ModelVendors
103
+ .filter(mv => mv.Status === 'Active' && AIEngine.Instance.IsInferenceProvider(mv) && (mv.DriverClass ?? '') === 'GeminiImageGenerator' && !!mv.APIName)
104
+ .sort((a, b) => (b.Priority || 0) - (a.Priority || 0))[0];
105
+ if (vendor?.APIName) {
106
+ const vendorName = AIEngine.Instance.Vendors.find(v => UUIDsEqual(v.ID, vendor.VendorID))?.Name ?? 'Google';
107
+ LogStatus(`GenerateAdImage: catalog image model ${m.Name} (${vendor.APIName}, ${vendorName})`);
108
+ return vendor.APIName;
109
+ }
110
+ }
111
+ LogStatus('GenerateAdImage: no active Gemini image model in the AI model catalog — using the provider default');
112
+ return null;
113
+ }
114
+ catch (e) {
115
+ LogError(`GenerateAdImage: AI model catalog unavailable (${e instanceof Error ? e.message : String(e)}) — using the provider default`);
116
+ return null;
117
+ }
118
+ }
119
+ async loadBrand(brandId, params) {
120
+ const res = await new RunView().RunView({
121
+ EntityName: toMarketingEntityName('Brands'), ExtraFilter: `ID='${brandId}'`,
122
+ Fields: ['BrandName', 'VisualIdentityGuidelines', 'BrandDosAndDonts'], MaxRows: 1, ResultType: 'simple',
123
+ }, params.ContextUser);
124
+ if (!res.Success)
125
+ throw new Error(`Brand lookup failed: ${res.ErrorMessage}`);
126
+ return res.Results?.[0] ?? null;
127
+ }
128
+ get Params() {
129
+ return [
130
+ { Name: 'BrandID', Type: 'Input', Value: null },
131
+ { Name: 'Brief', Type: 'Input', Value: null },
132
+ { Name: 'Frame', Type: 'Both', Value: null },
133
+ { Name: 'Headline', Type: 'Input', Value: null },
134
+ { Name: 'PrimaryText', Type: 'Input', Value: null },
135
+ { Name: 'SourceImageUrl', Type: 'Input', Value: null },
136
+ { Name: 'StyleOverride', Type: 'Input', Value: null },
137
+ { Name: 'Count', Type: 'Input', Value: null },
138
+ { Name: 'Images', Type: 'Output', Value: null },
139
+ { Name: 'Reason', Type: 'Output', Value: null },
140
+ ];
141
+ }
142
+ get Description() {
143
+ return 'Generates (or adapts from a supplied source image) a picture for an ad under the brand\'s visual guidelines, hosts it with the brand\'s images, and judges it against the platform frame (landscape 1.91:1 or square). Returns the candidates with their verdicts; the Creative Agent chooses, the proposal card shows it, a person approves.';
144
+ }
145
+ };
146
+ GenerateAdImageAction = __decorate([
147
+ RegisterClass(BaseAction, "Generate Ad Image")
148
+ ], GenerateAdImageAction);
149
+ export { GenerateAdImageAction };
150
+ /** Anti-tree-shaking anchor. */
151
+ export function LoadGenerateAdImageAction() {
152
+ /* keeps the registration alive */
153
+ }
154
+ //# sourceMappingURL=GenerateAdImageAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerateAdImageAction.js","sourceRoot":"","sources":["../../src/business/GenerateAdImageAction.ts"],"names":[],"mappings":";;;;;;AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAY,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,qBAAqB,EAAqB,MAAM,6BAA6B,CAAC;AACrL,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAiB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBjB,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,mBAAmB;IAC1D,IAAuB,YAAY,KAAe,OAAO,UAAU,CAAC,CAAC,CAAC;IAE5D,KAAK,CAAC,iBAAiB,CAAC,MAAuB;QACrD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;QAClG,CAAC;QACD,IAAI,OAAe,EAAE,KAAa,EAAE,KAAmB,EAAE,QAAuB,EAAE,WAA0B,EAAE,cAA6B,EAAE,aAA4B,EAAE,KAAa,CAAC;QACzL,IAAI,CAAC;YACD,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,WAAW,CAAC;YACrF,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,QAAQ,KAAK,CAAC,CAAC;YAC7G,KAAK,GAAG,QAAQ,CAAC;YACjB,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC;YACpF,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC;YAC3F,cAAc,GAAG,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC;YACpH,aAAa,GAAG,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC;YAC9F,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QACjG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;QAC5H,CAAC;QACD,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,OAAO,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;YACvG,MAAM,QAAQ,GAAG,oBAAoB,CAAC;gBAClC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE,aAAa;gBAC3E,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,wBAAwB,EAAE,KAAK,CAAC,wBAAwB,EAAE,WAAW,EAAE,KAAK,CAAC,gBAAgB;aAC5H,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACrE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,IAAI,MAAM,GAAkB,IAAI,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC;oBACnC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc;oBACpG,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW;oBAClD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI;iBACtE,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,sCAAsC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC1H,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,gDAAgD,CAAC,EAAE,CAAC;gBAC3H,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACzJ,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,IAAI,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAClF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,QAAQ,CAAC,uCAAuC,OAAO,MAAM,MAAM,EAAE,CAAC,CAAC;gBACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,kCAAkC,MAAM,EAAE,EAAE,CAAC;YAClI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;YAC/C,SAAS,CAAC,oBAAoB,MAAM,CAAC,MAAM,IAAI,KAAK,uBAAuB,OAAO,QAAQ,KAAK,IAAI,4BAA4B,KAAK,MAAM,4BAA4B,cAAc,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpO,OAAO;gBACH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM;gBAC/F,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,uBAAuB,MAAM,6BAA6B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;aACpO,CAAC;QACN,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;YAChE,QAAQ,CAAC,oCAAoC,OAAO,KAAK,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAC9E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QACjE,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,iBAAiB,CAAC,IAAc;QAC1C,IAAI,CAAC;YACD,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM;iBACtC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,iBAAiB,IAAI,CAAC,CAAC,QAAQ,CAAC;iBAC7E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7D,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY;qBACxB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,KAAK,sBAAsB,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;qBACtJ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBAClB,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,IAAI,QAAQ,CAAC;oBAC5G,SAAS,CAAC,wCAAwC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,KAAK,UAAU,GAAG,CAAC,CAAC;oBAC/F,OAAO,MAAM,CAAC,OAAO,CAAC;gBAC1B,CAAC;YACL,CAAC;YACD,SAAS,CAAC,oGAAoG,CAAC,CAAC;YAChH,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,QAAQ,CAAC,kDAAkD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;YACvI,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,MAAuB;QAC5D,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,OAAO,CAAqG;YACxI,UAAU,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,OAAO,OAAO,GAAG;YAC3E,MAAM,EAAE,CAAC,WAAW,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ;SAC1G,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9E,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,IAAW,MAAM;QACb,OAAO;YACH,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;YAC/C,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;YAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;YAC5C,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;YAChD,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;YACnD,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;YACtD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;YACrD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;YAC7C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;YAC/C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;SAClD,CAAC;IACN,CAAC;IAED,IAAW,WAAW;QAClB,OAAO,+UAA+U,CAAC;IAC3V,CAAC;CACJ,CAAA;AA7HY,qBAAqB;IADjC,aAAa,CAAC,UAAU,EAAE,mBAAmB,CAAC;GAClC,qBAAqB,CA6HjC;;AAED,gCAAgC;AAChC,MAAM,UAAU,yBAAyB;IACrC,kCAAkC;AACtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAC3G,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AA6FxD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CA6F3C;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAC3G,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AAiGxD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAiG3C;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
package/dist/index.js CHANGED
@@ -35,6 +35,9 @@ import { LoadObserveProgramsAction } from './writes/ObserveProgramsAction.js';
35
35
  import { LoadRecordProgramObservationAction } from './writes/RecordProgramObservationAction.js';
36
36
  import { LoadSyncMarketingDataAction } from './writes/SyncMarketingDataAction.js';
37
37
  import { LoadRefreshProgramStatusAction } from './writes/RefreshProgramStatusAction.js';
38
+ import { LoadCheckEarlyServingAction } from './writes/CheckEarlyServingAction.js';
39
+ import { LoadListAdAccountAudiencesAction } from './reads/ListAdAccountAudiencesAction.js';
40
+ import { LoadResumeProgramAction } from './writes/ResumeProgramAction.js';
38
41
  import { LoadDeclineProgramProposalAction } from './writes/DeclineProgramProposalAction.js';
39
42
  import { LoadRecordMarketingSignalAction } from './writes/RecordMarketingSignalAction.js';
40
43
  import { LoadScaleProgramAction } from './writes/ScaleProgramAction.js';
@@ -84,6 +87,7 @@ import { LoadDiarizePodcastEpisodeAction } from './business/DiarizePodcastEpisod
84
87
  import { LoadFetchTrendsAction } from './business/FetchTrendsAction.js';
85
88
  import { LoadFinalizeStrategyOnboardingAction } from './business/FinalizeStrategyOnboardingAction.js';
86
89
  import { LoadGenerateAndQueueVariationsAction } from './business/GenerateAndQueueVariationsAction.js';
90
+ import { LoadGenerateAdImageAction } from './business/GenerateAdImageAction.js';
87
91
  import { LoadGenerateLinkedInVariationsAction } from './business/GenerateLinkedInVariationsAction.js';
88
92
  import { LoadGenerateSummaryAction } from './business/GenerateSummaryAction.js';
89
93
  import { LoadGetIntegrationHealthAction } from './business/GetIntegrationHealthAction.js';
@@ -132,6 +136,9 @@ export function LoadMarketingActions() {
132
136
  LoadRecordProgramObservationAction();
133
137
  LoadSyncMarketingDataAction();
134
138
  LoadRefreshProgramStatusAction();
139
+ LoadCheckEarlyServingAction();
140
+ LoadListAdAccountAudiencesAction();
141
+ LoadResumeProgramAction();
135
142
  LoadDeclineProgramProposalAction();
136
143
  LoadRecordMarketingSignalAction();
137
144
  LoadScaleProgramAction();
@@ -181,6 +188,7 @@ export function LoadMarketingActions() {
181
188
  LoadFetchTrendsAction();
182
189
  LoadFinalizeStrategyOnboardingAction();
183
190
  LoadGenerateAndQueueVariationsAction();
191
+ LoadGenerateAdImageAction();
184
192
  LoadGenerateLinkedInVariationsAction();
185
193
  LoadGenerateSummaryAction();
186
194
  LoadGetIntegrationHealthAction();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,8 @@ export declare class DecideProgramOperationHandler extends MarketingDecideProgra
27
27
  * THIS program's graph — re-derived here, not taken on trust.
28
28
  */
29
29
  private viaWorkflow;
30
+ /** Polls the program row until the workflow's Decide step has written `Decision`, or the budget is spent. */
31
+ private awaitRecordedDecision;
30
32
  }
31
33
  /** Anti-tree-shaking anchor: importing this module registers the handlers; call from the server bootstrap. */
32
34
  export declare function LoadMarketingProgramOperations(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ProgramOperations.d.ts","sourceRoot":"","sources":["../../src/operations/ProgramOperations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAA0B,KAAK,iBAAiB,EAAyB,KAAK,QAAQ,EAAuB,MAAM,sBAAsB,CAAC;AAIjJ,OAAO,EACH,gCAAgC,EAChC,iCAAiC,EACjC,gCAAgC,EAChC,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EAEnC,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EAIpC,MAAM,iCAAiC,CAAC;AAoFzC,qBACa,8BAA+B,SAAQ,gCAAgC;cACvD,eAAe,CAAC,KAAK,EAAE,0BAA0B,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC;CAsBpK;AAeD,qBACa,+BAAgC,SAAQ,iCAAiC;cACzD,eAAe,CAAC,KAAK,EAAE,0BAA0B,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,8BAA8B,CAAC;CA2BrK;AAID,qBACa,8BAA+B,SAAQ,gCAAgC;cACvD,eAAe,CAAC,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC;CA2DrK;AAsBD,qBACa,6BAA8B,SAAQ,+BAA+B;cACrD,eAAe,CAAC,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,4BAA4B,CAAC;IA6BhK;;;;OAIG;YACW,WAAW;CAqF5B;AAED,8GAA8G;AAC9G,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}
1
+ {"version":3,"file":"ProgramOperations.d.ts","sourceRoot":"","sources":["../../src/operations/ProgramOperations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAA0B,KAAK,iBAAiB,EAAyB,KAAK,QAAQ,EAAuB,MAAM,sBAAsB,CAAC;AAIjJ,OAAO,EACH,gCAAgC,EAChC,iCAAiC,EACjC,gCAAgC,EAChC,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EAEnC,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EAIpC,MAAM,iCAAiC,CAAC;AAoFzC,qBACa,8BAA+B,SAAQ,gCAAgC;cACvD,eAAe,CAAC,KAAK,EAAE,0BAA0B,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC;CAsBpK;AAeD,qBACa,+BAAgC,SAAQ,iCAAiC;cACzD,eAAe,CAAC,KAAK,EAAE,0BAA0B,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,8BAA8B,CAAC;CA2BrK;AAID,qBACa,8BAA+B,SAAQ,gCAAgC;cACvD,eAAe,CAAC,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC;CAuDrK;AAsBD,qBACa,6BAA8B,SAAQ,+BAA+B;cACrD,eAAe,CAAC,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,4BAA4B,CAAC;IA6BhK;;;;OAIG;YACW,WAAW;IAyFzB,6GAA6G;YAC/F,qBAAqB;CActC;AAMD,8GAA8G;AAC9G,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}
@@ -206,20 +206,15 @@ let ApproveProgramOperationHandler = class ApproveProgramOperationHandler extend
206
206
  let lock = await runWrappedAction('Lock Program', { BrandID: input.BrandID, ProgramID: input.ProgramID }, user);
207
207
  if (!lock.Success && lock.ResultCode === 'NO_PLANNED_SPRINT') {
208
208
  // Approving must never end in "go and plan a sprint first" (KI-33). A started sprint is locked (product owner,
209
- // 2026-09-29), so the order matters: plan the sprint WITHOUT starting it, lock the program into it while it is
210
- // still in Planning, THEN start it if the brand has nothing running (a brand's first sprint, KI-87). Every
211
- // step is its action — its own gate and its execution-log row — like the rest of this handler.
209
+ // 2026-09-29), so the order matters: plan the sprint WITHOUT starting it, then lock the program into it while
210
+ // it is still in Planning (a brand's first sprint, KI-87). Lock applies the sprint clock itself once the
211
+ // program is in the sprint (D-28), so a due sprint starts there — on a first try and on every retry alike.
212
+ // Every step is its action — its own gate and its execution-log row — like the rest of this handler.
212
213
  const plan = await runWrappedAction('Plan Next Sprint', { BrandID: input.BrandID, StartIfIdle: false }, user);
213
214
  if (!plan.Success)
214
215
  return fail(issue(plan.ResultCode ?? 'PLAN_FAILED', `Approved, but no sprint was planned and planning one failed: ${plan.Message}`), true);
215
216
  planned = sprintRef(outNumber(plan, 'SprintNumber'), isoDate(outString(plan, 'StartDate')), isoDate(outString(plan, 'EndDate')));
216
217
  lock = await runWrappedAction('Lock Program', { BrandID: input.BrandID, ProgramID: input.ProgramID }, user);
217
- if (lock.Success || (lock.ResultCode?.startsWith('GRAPH_') ?? false)) {
218
- const start = await runWrappedAction('Start Due Sprints', { BrandID: input.BrandID }, user);
219
- // Not fatal: the program is locked and scheduled; the sprint clock starts a due sprint on its next tick.
220
- if (!start.Success)
221
- LogError(`Marketing.ApproveProgram: Start Due Sprints after scheduling failed (${start.ResultCode}): ${start.Message}`);
222
- }
223
218
  }
224
219
  // A failed graph submission leaves the program locked and scheduled — say so rather than "not locked".
225
220
  const locked = lock.Success || (lock.ResultCode?.startsWith('GRAPH_') ?? false);
@@ -388,16 +383,39 @@ let DecideProgramOperationHandler = class DecideProgramOperationHandler extends
388
383
  LogError(`Marketing.DecideProgram: could not answer ${program.Code ?? input.ProgramID}'s gate: ${msg}`);
389
384
  return out(false, [issue('SAVE_FAILED', `Could not send the decision to the workflow: ${msg}`)], msg);
390
385
  }
391
- // Returns at once (MJ's pattern: the dispatcher settles the gate and runs Decide Program shortly after; the page
392
- // reloads when those rows land — their saves reach the browser as remote-invalidate events). DecisionApplied stays
393
- // null: this call answered the gate, it did not record the decision.
394
- return out(true, [], 'Decision sent to the program\'s workflow, which records it through Decide Program.');
386
+ // D-33: the operation owns the transaction, as orders' refund and accounting's posting operations do — it waits
387
+ // (bounded) for the dispatcher to record the decision and returns it, so the page renders the result of the call
388
+ // rather than hoping a remote-invalidate event reaches a socket that may have died (KI-147). Past the budget it
389
+ // answers honestly: the gate is answered, the decision not yet recorded, and the page keeps its pending state.
390
+ const applied = await this.awaitRecordedDecision(provider, user, input.ProgramID, DECISION_RECORD_BUDGET_MS);
391
+ if (!applied)
392
+ return out(true, [], 'Decision sent to the program\'s workflow, which records it through Decide Program.');
393
+ return { ...out(true, [], `${program.Code ?? 'Program'} decided: ${applied}.`), DecisionApplied: applied };
394
+ }
395
+ /** Polls the program row until the workflow's Decide step has written `Decision`, or the budget is spent. */
396
+ async awaitRecordedDecision(provider, user, programId, budgetMs) {
397
+ const started = Date.now();
398
+ while (Date.now() - started < budgetMs) {
399
+ await new Promise(resolve => setTimeout(resolve, DECISION_RECORD_POLL_MS));
400
+ const res = await provider.RunView({
401
+ EntityName: toMarketingEntityName('Programs'), ExtraFilter: `ID='${programId}'`,
402
+ Fields: ['Decision'], MaxRows: 1, ResultType: 'simple', BypassCache: true,
403
+ }, user);
404
+ const d = res.Success ? res.Results?.[0]?.Decision : null;
405
+ if (d === 'Keep' || d === 'Iterate' || d === 'Kill')
406
+ return d;
407
+ }
408
+ LogStatus(`Marketing.DecideProgram: ${programId} — gate answered; the workflow had not recorded the decision within ${Math.round(budgetMs / 1000)}s.`);
409
+ return null;
395
410
  }
396
411
  };
397
412
  DecideProgramOperationHandler = __decorate([
398
413
  RegisterClass(BaseRemotableOperation, 'Marketing.DecideProgram')
399
414
  ], DecideProgramOperationHandler);
400
415
  export { DecideProgramOperationHandler };
416
+ /** How long the decide operation waits for the dispatcher to record a workflow decision before answering "sent". */
417
+ const DECISION_RECORD_BUDGET_MS = 20_000;
418
+ const DECISION_RECORD_POLL_MS = 500;
401
419
  /** Anti-tree-shaking anchor: importing this module registers the handlers; call from the server bootstrap. */
402
420
  export function LoadMarketingProgramOperations() {
403
421
  // The @RegisterClass decorators above run on import; nothing else to do.