@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.
- package/dist/__tests__/approveProgramOperation.test.js +2 -3
- package/dist/__tests__/approveProgramOperation.test.js.map +1 -1
- package/dist/__tests__/generateAdImage.test.d.ts +2 -0
- package/dist/__tests__/generateAdImage.test.d.ts.map +1 -0
- package/dist/__tests__/generateAdImage.test.js +90 -0
- package/dist/__tests__/generateAdImage.test.js.map +1 -0
- package/dist/__tests__/scaleAdLevers.test.d.ts +2 -0
- package/dist/__tests__/scaleAdLevers.test.d.ts.map +1 -0
- package/dist/__tests__/scaleAdLevers.test.js +15 -0
- package/dist/__tests__/scaleAdLevers.test.js.map +1 -0
- package/dist/business/GenerateAdImageAction.d.ts +43 -0
- package/dist/business/GenerateAdImageAction.d.ts.map +1 -0
- package/dist/business/GenerateAdImageAction.js +154 -0
- package/dist/business/GenerateAdImageAction.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/operations/ProgramOperations.d.ts +2 -0
- package/dist/operations/ProgramOperations.d.ts.map +1 -1
- package/dist/operations/ProgramOperations.js +31 -13
- package/dist/operations/ProgramOperations.js.map +1 -1
- package/dist/reads/GetProgramContextAction.d.ts.map +1 -1
- package/dist/reads/GetProgramContextAction.js +25 -7
- package/dist/reads/GetProgramContextAction.js.map +1 -1
- package/dist/reads/ListAdAccountAudiencesAction.d.ts +17 -0
- package/dist/reads/ListAdAccountAudiencesAction.d.ts.map +1 -0
- package/dist/reads/ListAdAccountAudiencesAction.js +71 -0
- package/dist/reads/ListAdAccountAudiencesAction.js.map +1 -0
- package/dist/reads/PreCheckProgramAction.d.ts.map +1 -1
- package/dist/reads/PreCheckProgramAction.js +6 -2
- package/dist/reads/PreCheckProgramAction.js.map +1 -1
- package/dist/writes/CheckEarlyServingAction.d.ts +28 -0
- package/dist/writes/CheckEarlyServingAction.d.ts.map +1 -0
- package/dist/writes/CheckEarlyServingAction.js +181 -0
- package/dist/writes/CheckEarlyServingAction.js.map +1 -0
- package/dist/writes/ConnectBrandCredentialAction.d.ts.map +1 -1
- package/dist/writes/ConnectBrandCredentialAction.js +41 -2
- package/dist/writes/ConnectBrandCredentialAction.js.map +1 -1
- package/dist/writes/LockProgramAction.d.ts.map +1 -1
- package/dist/writes/LockProgramAction.js +22 -3
- package/dist/writes/LockProgramAction.js.map +1 -1
- package/dist/writes/ProposeProgramAction.d.ts.map +1 -1
- package/dist/writes/ProposeProgramAction.js +17 -2
- package/dist/writes/ProposeProgramAction.js.map +1 -1
- package/dist/writes/ResumeProgramAction.d.ts +17 -0
- package/dist/writes/ResumeProgramAction.d.ts.map +1 -0
- package/dist/writes/ResumeProgramAction.js +86 -0
- package/dist/writes/ResumeProgramAction.js.map +1 -0
- package/dist/writes/ScaleProgramAction.d.ts +2 -0
- package/dist/writes/ScaleProgramAction.d.ts.map +1 -1
- package/dist/writes/ScaleProgramAction.js +19 -0
- package/dist/writes/ScaleProgramAction.js.map +1 -1
- 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,
|
|
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'
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"approveProgramOperation.test.js","sourceRoot":"","sources":["../../src/__tests__/approveProgramOperation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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
|
|
210
|
-
// still in Planning
|
|
211
|
-
//
|
|
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
|
-
//
|
|
392
|
-
//
|
|
393
|
-
//
|
|
394
|
-
|
|
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.
|