@actuate-media/plugin-ai 0.0.11 → 0.2.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 (131) hide show
  1. package/LICENSE +21 -21
  2. package/dist/__tests__/content-generator.test.d.ts +2 -0
  3. package/dist/__tests__/content-generator.test.d.ts.map +1 -0
  4. package/dist/__tests__/content-generator.test.js +200 -0
  5. package/dist/__tests__/content-generator.test.js.map +1 -0
  6. package/dist/__tests__/index.test.js.map +1 -1
  7. package/dist/admin/AIScorePanel.d.ts +1 -1
  8. package/dist/admin/AIScorePanel.d.ts.map +1 -1
  9. package/dist/admin/AIScorePanel.js +34 -17
  10. package/dist/admin/AIScorePanel.js.map +1 -1
  11. package/dist/admin/BrandVoiceSettings.d.ts +2 -2
  12. package/dist/admin/BrandVoiceSettings.d.ts.map +1 -1
  13. package/dist/admin/BrandVoiceSettings.js +123 -34
  14. package/dist/admin/BrandVoiceSettings.js.map +1 -1
  15. package/dist/admin/ContentScoreDashboard.d.ts +1 -1
  16. package/dist/admin/ContentScoreDashboard.d.ts.map +1 -1
  17. package/dist/admin/ContentScoreDashboard.js +50 -16
  18. package/dist/admin/ContentScoreDashboard.js.map +1 -1
  19. package/dist/admin/WritingAssistantToolbar.d.ts.map +1 -1
  20. package/dist/admin/WritingAssistantToolbar.js +21 -21
  21. package/dist/admin/WritingAssistantToolbar.js.map +1 -1
  22. package/dist/brand/consistency-checker.d.ts +3 -3
  23. package/dist/brand/consistency-checker.d.ts.map +1 -1
  24. package/dist/brand/consistency-checker.js +7 -7
  25. package/dist/brand/consistency-checker.js.map +1 -1
  26. package/dist/brand/profile-builder.d.ts +2 -2
  27. package/dist/brand/profile-builder.d.ts.map +1 -1
  28. package/dist/brand/profile-builder.js +20 -19
  29. package/dist/brand/profile-builder.js.map +1 -1
  30. package/dist/brand/voice-profile.d.ts +4 -4
  31. package/dist/brand/voice-profile.d.ts.map +1 -1
  32. package/dist/collections.d.ts +1 -1
  33. package/dist/collections.d.ts.map +1 -1
  34. package/dist/collections.js.map +1 -1
  35. package/dist/fields.d.ts +1 -1
  36. package/dist/fields.d.ts.map +1 -1
  37. package/dist/fields.js.map +1 -1
  38. package/dist/hooks.d.ts.map +1 -1
  39. package/dist/hooks.js +16 -14
  40. package/dist/hooks.js.map +1 -1
  41. package/dist/index.d.ts +33 -29
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +36 -34
  44. package/dist/index.js.map +1 -1
  45. package/dist/links/smart-links.d.ts.map +1 -1
  46. package/dist/links/smart-links.js +2 -2
  47. package/dist/links/smart-links.js.map +1 -1
  48. package/dist/media/alt-text-generator.d.ts +2 -2
  49. package/dist/media/alt-text-generator.d.ts.map +1 -1
  50. package/dist/media/alt-text-generator.js +14 -9
  51. package/dist/media/alt-text-generator.js.map +1 -1
  52. package/dist/media/auto-tagger.d.ts +1 -1
  53. package/dist/media/auto-tagger.d.ts.map +1 -1
  54. package/dist/media/auto-tagger.js +8 -5
  55. package/dist/media/auto-tagger.js.map +1 -1
  56. package/dist/page-builder/generate.d.ts +23 -0
  57. package/dist/page-builder/generate.d.ts.map +1 -0
  58. package/dist/page-builder/generate.js +422 -0
  59. package/dist/page-builder/generate.js.map +1 -0
  60. package/dist/page-builder/index.d.ts +3 -0
  61. package/dist/page-builder/index.d.ts.map +1 -0
  62. package/dist/page-builder/index.js +2 -0
  63. package/dist/page-builder/index.js.map +1 -0
  64. package/dist/providers/anthropic.d.ts +1 -1
  65. package/dist/providers/anthropic.d.ts.map +1 -1
  66. package/dist/providers/anthropic.js +32 -32
  67. package/dist/providers/anthropic.js.map +1 -1
  68. package/dist/providers/index.d.ts +1 -1
  69. package/dist/providers/index.d.ts.map +1 -1
  70. package/dist/providers/index.js +6 -6
  71. package/dist/providers/index.js.map +1 -1
  72. package/dist/providers/openai.d.ts +1 -1
  73. package/dist/providers/openai.d.ts.map +1 -1
  74. package/dist/providers/openai.js +24 -24
  75. package/dist/providers/openai.js.map +1 -1
  76. package/dist/scoring/accessibility.d.ts +1 -1
  77. package/dist/scoring/accessibility.d.ts.map +1 -1
  78. package/dist/scoring/accessibility.js +22 -22
  79. package/dist/scoring/accessibility.js.map +1 -1
  80. package/dist/scoring/brand-alignment.d.ts +1 -1
  81. package/dist/scoring/brand-alignment.d.ts.map +1 -1
  82. package/dist/scoring/brand-alignment.js +14 -12
  83. package/dist/scoring/brand-alignment.js.map +1 -1
  84. package/dist/scoring/composite.d.ts +1 -1
  85. package/dist/scoring/composite.d.ts.map +1 -1
  86. package/dist/scoring/composite.js +5 -5
  87. package/dist/scoring/composite.js.map +1 -1
  88. package/dist/scoring/freshness.d.ts +1 -1
  89. package/dist/scoring/freshness.d.ts.map +1 -1
  90. package/dist/scoring/freshness.js +5 -7
  91. package/dist/scoring/freshness.js.map +1 -1
  92. package/dist/scoring/readability.d.ts +1 -1
  93. package/dist/scoring/readability.d.ts.map +1 -1
  94. package/dist/scoring/readability.js +8 -8
  95. package/dist/scoring/readability.js.map +1 -1
  96. package/dist/scoring/seo-score.d.ts.map +1 -1
  97. package/dist/scoring/seo-score.js +82 -16
  98. package/dist/scoring/seo-score.js.map +1 -1
  99. package/dist/search/clustering.d.ts +1 -1
  100. package/dist/search/clustering.d.ts.map +1 -1
  101. package/dist/search/clustering.js +7 -9
  102. package/dist/search/clustering.js.map +1 -1
  103. package/dist/search/embeddings.d.ts +1 -1
  104. package/dist/search/embeddings.d.ts.map +1 -1
  105. package/dist/search/embeddings.js +3 -3
  106. package/dist/search/embeddings.js.map +1 -1
  107. package/dist/search/semantic-search.d.ts +1 -1
  108. package/dist/search/semantic-search.d.ts.map +1 -1
  109. package/dist/search/semantic-search.js +5 -5
  110. package/dist/search/semantic-search.js.map +1 -1
  111. package/dist/translation/translator.d.ts +2 -2
  112. package/dist/translation/translator.d.ts.map +1 -1
  113. package/dist/translation/translator.js +8 -8
  114. package/dist/translation/translator.js.map +1 -1
  115. package/dist/writing/assistant.d.ts +3 -3
  116. package/dist/writing/assistant.d.ts.map +1 -1
  117. package/dist/writing/assistant.js +19 -16
  118. package/dist/writing/assistant.js.map +1 -1
  119. package/dist/writing/content-generator.d.ts +107 -0
  120. package/dist/writing/content-generator.d.ts.map +1 -0
  121. package/dist/writing/content-generator.js +273 -0
  122. package/dist/writing/content-generator.js.map +1 -0
  123. package/dist/writing/inline-suggestions.d.ts +2 -2
  124. package/dist/writing/inline-suggestions.d.ts.map +1 -1
  125. package/dist/writing/inline-suggestions.js +8 -5
  126. package/dist/writing/inline-suggestions.js.map +1 -1
  127. package/dist/writing/meta-generator.d.ts +2 -2
  128. package/dist/writing/meta-generator.d.ts.map +1 -1
  129. package/dist/writing/meta-generator.js +21 -9
  130. package/dist/writing/meta-generator.js.map +1 -1
  131. package/package.json +3 -2
@@ -1,4 +1,4 @@
1
- import type { AIProvider } from "../providers/index.js";
1
+ import type { AIProvider } from '../providers/index.js';
2
2
  export interface TaggingOptions {
3
3
  maxTags?: number;
4
4
  language?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"auto-tagger.d.ts","sourceRoot":"","sources":["../../src/media/auto-tagger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;CACjC;AAED,4DAA4D;AAC5D,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,SAAS,CAAC,CAgDpB"}
1
+ {"version":3,"file":"auto-tagger.d.ts","sourceRoot":"","sources":["../../src/media/auto-tagger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,QAAQ,CAAC,EAAE,UAAU,CAAA;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClD,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,UAAU,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAA;CAChC;AAED,4DAA4D;AAC5D,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAmDjG"}
@@ -1,11 +1,11 @@
1
- import { requireAIProvider } from "../providers/index.js";
1
+ import { requireAIProvider } from '../providers/index.js';
2
2
  /** Automatically tags an image using AI vision analysis. */
3
3
  export async function autoTagImage(imageUrl, options) {
4
4
  const ai = options?.provider ?? requireAIProvider();
5
5
  const maxTags = options?.maxTags ?? 10;
6
6
  const categoryContext = options?.categories?.length
7
- ? `\nAvailable categories to choose from: ${options.categories.join(", ")}`
8
- : "";
7
+ ? `\nAvailable categories to choose from: ${options.categories.join(', ')}`
8
+ : '';
9
9
  const prompt = `Analyze this image and provide tags, categories, and color information.
10
10
  ${categoryContext}
11
11
 
@@ -17,12 +17,15 @@ Return a JSON object with:
17
17
 
18
18
  Image URL: ${imageUrl}`;
19
19
  const result = await ai.generateText(prompt, {
20
- systemPrompt: `You are an image analysis expert. Analyze images and return structured tags.${options?.language ? ` Respond in ${options.language}.` : ""} Return valid JSON only.`,
20
+ systemPrompt: `You are an image analysis expert. Analyze images and return structured tags.${options?.language ? ` Respond in ${options.language}.` : ''} Return valid JSON only.`,
21
21
  maxTokens: 512,
22
22
  temperature: 0.2,
23
23
  });
24
24
  try {
25
- const cleaned = result.text.replace(/```json?\n?/g, "").replace(/```/g, "").trim();
25
+ const cleaned = result.text
26
+ .replace(/```json?\n?/g, '')
27
+ .replace(/```/g, '')
28
+ .trim();
26
29
  const parsed = JSON.parse(cleaned);
27
30
  return {
28
31
  tags: (parsed.tags ?? []).slice(0, maxTags),
@@ -1 +1 @@
1
- {"version":3,"file":"auto-tagger.js","sourceRoot":"","sources":["../../src/media/auto-tagger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAgB1D,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,OAAwB;IAExB,MAAM,EAAE,GAAG,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IAEvC,MAAM,eAAe,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM;QACjD,CAAC,CAAC,0CAA0C,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC3E,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,MAAM,GAAG;EACf,eAAe;;;0EAGyD,OAAO;;;;;aAKpE,QAAQ,EAAE,CAAC;IAEtB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE;QAC3C,YAAY,EAAE,+EAA+E,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,0BAA0B;QAClL,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAKhC,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;YAC3C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;YACnC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE;YAC3C,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE;SAC9C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"auto-tagger.js","sourceRoot":"","sources":["../../src/media/auto-tagger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAgBzD,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,OAAwB;IAC3E,MAAM,EAAE,GAAG,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,CAAA;IACnD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IAEtC,MAAM,eAAe,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM;QACjD,CAAC,CAAC,0CAA0C,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC3E,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,MAAM,GAAG;EACf,eAAe;;;0EAGyD,OAAO;;;;;aAKpE,QAAQ,EAAE,CAAA;IAErB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE;QAC3C,YAAY,EAAE,+EAA+E,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,0BAA0B;QAClL,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,GAAG;KACjB,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI;aACxB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;aAC3B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;aACnB,IAAI,EAAE,CAAA;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAKhC,CAAA;QAED,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;YAC3C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;YACnC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE;YAC3C,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE;SAC9C,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SAC7B,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { GenerationContext, GenerationResult } from '@actuate-media/cms-core';
2
+ export interface PageGenerationCallbacks {
3
+ onProgress?: (progress: {
4
+ currentStep: string;
5
+ completedSteps: string[];
6
+ totalSteps: number;
7
+ message: string;
8
+ }) => void;
9
+ }
10
+ export interface BlockGenerationContext {
11
+ blockType: string;
12
+ variant?: string;
13
+ pageContext?: {
14
+ pageTitle?: string;
15
+ pageTemplate?: string;
16
+ businessName?: string;
17
+ surroundingContent?: string;
18
+ };
19
+ tone?: string;
20
+ }
21
+ export declare function generatePage(ctx: GenerationContext, callbacks?: PageGenerationCallbacks): Promise<GenerationResult>;
22
+ export declare function generateBlockContent(ctx: BlockGenerationContext): Promise<Record<string, unknown>>;
23
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/page-builder/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAGjB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AAqChC,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QACtB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,MAAM,EAAE,CAAA;QACxB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;KAChB,KAAK,IAAI,CAAA;CACX;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE;QACZ,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAC5B,CAAA;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAmTD,wBAAsB,YAAY,CAChC,GAAG,EAAE,iBAAiB,EACtB,SAAS,CAAC,EAAE,uBAAuB,GAClC,OAAO,CAAC,gBAAgB,CAAC,CAyE3B;AAUD,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,sBAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAuDlC"}
@@ -0,0 +1,422 @@
1
+ import { buildStructurePrompt, buildContentPrompt, buildSEOPrompt, buildAccessibilityPrompt, validateTree, fixAccessibility, BUILT_IN_TEMPLATES, } from '@actuate-media/cms-core';
2
+ import { requireAIProvider } from '../providers/index.js';
3
+ // ─── Constants ────────────────────────────────────────────────────────
4
+ const SYSTEM_PROMPT = [
5
+ 'You are an expert web page designer and developer.',
6
+ 'You generate valid JSON page tree structures following a strict schema.',
7
+ '',
8
+ 'Rules:',
9
+ '- Always output valid JSON. Never include markdown, explanations, or commentary.',
10
+ '- Column widths in each row MUST sum to exactly 12.',
11
+ '- Use only available block types: hero, text, image, cards, cta, video, gallery, faq, form, code.',
12
+ '- Every node must have a unique id in the format "node_<random8chars>".',
13
+ '- Follow the nesting rules: page > section > container|row, row > column, column > block|container.',
14
+ '- Never nest blocks inside other blocks.',
15
+ '- Generate high-quality, contextually appropriate content.',
16
+ ].join('\n');
17
+ const STEP_CONFIG = {
18
+ structure: { maxTokens: 4000, temperature: 0.7 },
19
+ content: { maxTokens: 4000, temperature: 0.7 },
20
+ seo: { maxTokens: 2000, temperature: 0.3 },
21
+ accessibility: { maxTokens: 2000, temperature: 0.3 },
22
+ };
23
+ // ─── JSON Parsing ─────────────────────────────────────────────────────
24
+ /**
25
+ * Locate and parse the first complete JSON object in a string by scanning for
26
+ * a balanced pair of braces, ignoring braces inside string literals.
27
+ *
28
+ * The previous implementation used `text.match(/\{[\s\S]*\}/)` — a greedy
29
+ * regex that matches from the first `{` to the LAST `}` in the string. When
30
+ * an LLM emits something like `{ "tree": {...} } trailing junk { stray }`,
31
+ * the greedy match concatenates them and JSON.parse throws on the result.
32
+ * Balanced-brace extraction handles those cases without false positives.
33
+ */
34
+ function extractJsonObject(text) {
35
+ let depth = 0;
36
+ let start = -1;
37
+ let inString = false;
38
+ let escape = false;
39
+ for (let i = 0; i < text.length; i++) {
40
+ const ch = text[i];
41
+ if (inString) {
42
+ if (escape) {
43
+ escape = false;
44
+ }
45
+ else if (ch === '\\') {
46
+ escape = true;
47
+ }
48
+ else if (ch === '"') {
49
+ inString = false;
50
+ }
51
+ continue;
52
+ }
53
+ if (ch === '"') {
54
+ inString = true;
55
+ }
56
+ else if (ch === '{') {
57
+ if (depth === 0)
58
+ start = i;
59
+ depth++;
60
+ }
61
+ else if (ch === '}') {
62
+ depth--;
63
+ if (depth === 0 && start !== -1) {
64
+ return text.slice(start, i + 1);
65
+ }
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ function safeParseJson(text) {
71
+ try {
72
+ return JSON.parse(text);
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ function tryExtractAndParse(text) {
79
+ const stripped = stripCodeFences(text);
80
+ const direct = safeParseJson(stripped);
81
+ if (direct)
82
+ return direct;
83
+ const extracted = extractJsonObject(stripped);
84
+ if (!extracted)
85
+ return null;
86
+ return safeParseJson(extracted);
87
+ }
88
+ function parseTreeFromResponse(text) {
89
+ const parsed = tryExtractAndParse(text);
90
+ if (!parsed || typeof parsed !== 'object')
91
+ return null;
92
+ if (parsed.type === 'page')
93
+ return parsed;
94
+ if (parsed.tree && parsed.tree.type === 'page')
95
+ return parsed.tree;
96
+ return null;
97
+ }
98
+ function parseSEOResponse(text) {
99
+ const parsed = tryExtractAndParse(text);
100
+ if (!parsed || typeof parsed !== 'object')
101
+ return null;
102
+ if (parsed.tree && parsed.tree.type === 'page') {
103
+ return {
104
+ tree: parsed.tree,
105
+ pageSEO: typeof parsed.pageSEO === 'object' && parsed.pageSEO !== null ? parsed.pageSEO : {},
106
+ };
107
+ }
108
+ return null;
109
+ }
110
+ function parseAccessibilityResponse(text) {
111
+ const parsed = tryExtractAndParse(text);
112
+ if (!parsed || typeof parsed !== 'object')
113
+ return null;
114
+ if (parsed.tree && parsed.tree.type === 'page') {
115
+ return {
116
+ tree: parsed.tree,
117
+ changes: Array.isArray(parsed.changes) ? parsed.changes : [],
118
+ };
119
+ }
120
+ return null;
121
+ }
122
+ function stripCodeFences(text) {
123
+ let result = text.trim();
124
+ const fencePattern = /^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/;
125
+ const match = fencePattern.exec(result);
126
+ if (match && match[1] !== undefined) {
127
+ result = match[1].trim();
128
+ }
129
+ else {
130
+ result = result.replace(/^```(?:json)?\s*\n?/, '').replace(/\n?\s*```$/, '');
131
+ }
132
+ return result.trim();
133
+ }
134
+ // ─── Step Handlers ────────────────────────────────────────────────────
135
+ async function runStructureStep(ctx) {
136
+ const provider = requireAIProvider();
137
+ const { maxTokens, temperature } = STEP_CONFIG.structure;
138
+ const templateTree = ctx.template ? BUILT_IN_TEMPLATES[ctx.template]?.tree : undefined;
139
+ const prompt = buildStructurePrompt(ctx, templateTree);
140
+ const result = await provider.generateText(prompt, {
141
+ maxTokens,
142
+ temperature,
143
+ systemPrompt: SYSTEM_PROMPT,
144
+ });
145
+ const tokensUsed = result.usage.promptTokens + result.usage.completionTokens;
146
+ let tree = parseTreeFromResponse(result.text);
147
+ if (!tree) {
148
+ throw new Error('Failed to parse page tree from AI response');
149
+ }
150
+ const validation = validateTree(tree);
151
+ if (!validation.valid) {
152
+ const retryPrompt = [
153
+ prompt,
154
+ '',
155
+ 'Your previous response had validation errors:',
156
+ ...validation.errors.map((e) => `- ${e}`),
157
+ '',
158
+ 'Please fix these errors and output a valid JSON tree.',
159
+ ].join('\n');
160
+ const retryResult = await provider.generateText(retryPrompt, {
161
+ maxTokens,
162
+ temperature,
163
+ systemPrompt: SYSTEM_PROMPT,
164
+ });
165
+ const retryTree = parseTreeFromResponse(retryResult.text);
166
+ const retryValidation = retryTree
167
+ ? validateTree(retryTree)
168
+ : { valid: false, errors: ['parse failed'] };
169
+ const finalTree = retryValidation.valid && retryTree ? retryTree : null;
170
+ if (!finalTree) {
171
+ // Refuse to return an invalid tree — downstream code (seo, content,
172
+ // a11y, persistence) all assume the structure validates.
173
+ throw new Error(`AI returned an invalid page tree after one retry. Errors: ${[
174
+ ...validation.errors,
175
+ ...retryValidation.errors,
176
+ ]
177
+ .slice(0, 5)
178
+ .join('; ')}`);
179
+ }
180
+ return {
181
+ tree: finalTree,
182
+ tokensUsed: tokensUsed + retryResult.usage.promptTokens + retryResult.usage.completionTokens,
183
+ changes: ['Generated page structure (recovered after one validation retry)'],
184
+ };
185
+ }
186
+ return {
187
+ tree,
188
+ tokensUsed,
189
+ changes: ['Generated page structure from prompt'],
190
+ };
191
+ }
192
+ async function runContentStep(ctx, currentTree) {
193
+ const provider = requireAIProvider();
194
+ const { maxTokens, temperature } = STEP_CONFIG.content;
195
+ const prompt = buildContentPrompt(ctx, currentTree);
196
+ const result = await provider.generateText(prompt, {
197
+ maxTokens,
198
+ temperature,
199
+ systemPrompt: SYSTEM_PROMPT,
200
+ });
201
+ const tokensUsed = result.usage.promptTokens + result.usage.completionTokens;
202
+ const tree = parseTreeFromResponse(result.text);
203
+ if (!tree || !validateTree(tree).valid) {
204
+ return {
205
+ tree: currentTree,
206
+ tokensUsed,
207
+ changes: ['Content generation failed validation — kept existing structure'],
208
+ };
209
+ }
210
+ return {
211
+ tree,
212
+ tokensUsed,
213
+ changes: ['Populated block content with generated copy'],
214
+ };
215
+ }
216
+ async function runSEOStep(ctx, currentTree) {
217
+ const provider = requireAIProvider();
218
+ const { maxTokens, temperature } = STEP_CONFIG.seo;
219
+ const prompt = buildSEOPrompt(ctx, currentTree);
220
+ const result = await provider.generateText(prompt, {
221
+ maxTokens,
222
+ temperature,
223
+ systemPrompt: SYSTEM_PROMPT,
224
+ });
225
+ const tokensUsed = result.usage.promptTokens + result.usage.completionTokens;
226
+ const parsed = parseSEOResponse(result.text);
227
+ if (!parsed || !validateTree(parsed.tree).valid) {
228
+ return {
229
+ tree: currentTree,
230
+ tokensUsed,
231
+ changes: ['SEO optimization failed validation — kept existing content'],
232
+ };
233
+ }
234
+ const changes = ['Applied SEO optimizations'];
235
+ if (parsed.pageSEO.metaTitle)
236
+ changes.push(`Meta title: "${parsed.pageSEO.metaTitle}"`);
237
+ if (parsed.pageSEO.focusKeyphrase)
238
+ changes.push(`Focus keyphrase: "${parsed.pageSEO.focusKeyphrase}"`);
239
+ return {
240
+ tree: parsed.tree,
241
+ tokensUsed,
242
+ changes,
243
+ };
244
+ }
245
+ async function runAccessibilityStep(currentTree) {
246
+ const provider = requireAIProvider();
247
+ const { maxTokens, temperature } = STEP_CONFIG.accessibility;
248
+ // First apply deterministic fixes
249
+ const { tree: fixedTree, report } = fixAccessibility(currentTree);
250
+ const changes = [];
251
+ if (report.fixedCount > 0) {
252
+ changes.push(`Applied ${report.fixedCount} automatic accessibility fix${report.fixedCount > 1 ? 'es' : ''}`);
253
+ }
254
+ // If there are remaining issues, use AI for non-deterministic fixes
255
+ if (report.remainingCount > 0) {
256
+ const prompt = buildAccessibilityPrompt(fixedTree);
257
+ const result = await provider.generateText(prompt, {
258
+ maxTokens,
259
+ temperature,
260
+ systemPrompt: SYSTEM_PROMPT,
261
+ });
262
+ const tokensUsed = result.usage.promptTokens + result.usage.completionTokens;
263
+ const parsed = parseAccessibilityResponse(result.text);
264
+ if (parsed && validateTree(parsed.tree).valid) {
265
+ changes.push(...parsed.changes);
266
+ return { tree: parsed.tree, tokensUsed, changes };
267
+ }
268
+ return {
269
+ tree: fixedTree,
270
+ tokensUsed,
271
+ changes: [...changes, 'AI accessibility pass failed validation — kept deterministic fixes'],
272
+ };
273
+ }
274
+ return { tree: fixedTree, tokensUsed: 0, changes };
275
+ }
276
+ // ─── Main Pipeline ────────────────────────────────────────────────────
277
+ const STEP_MESSAGES = {
278
+ structure: 'Generating page structure...',
279
+ content: 'Writing content for blocks...',
280
+ seo: 'Optimizing for search engines...',
281
+ accessibility: 'Improving accessibility...',
282
+ };
283
+ export async function generatePage(ctx, callbacks) {
284
+ const steps = ctx.steps;
285
+ const completedSteps = [];
286
+ const stepResults = [];
287
+ let currentTree = null;
288
+ let totalTokensUsed = 0;
289
+ const startTime = Date.now();
290
+ for (const step of steps) {
291
+ callbacks?.onProgress?.({
292
+ currentStep: step,
293
+ completedSteps: [...completedSteps],
294
+ totalSteps: steps.length,
295
+ message: STEP_MESSAGES[step] ?? `Running ${step} step...`,
296
+ });
297
+ const stepStart = Date.now();
298
+ let result;
299
+ switch (step) {
300
+ case 'structure':
301
+ result = await runStructureStep(ctx);
302
+ break;
303
+ case 'content':
304
+ if (!currentTree) {
305
+ throw new Error('Content step requires a structure step to run first');
306
+ }
307
+ result = await runContentStep(ctx, currentTree);
308
+ break;
309
+ case 'seo':
310
+ if (!currentTree) {
311
+ throw new Error('SEO step requires a structure step to run first');
312
+ }
313
+ result = await runSEOStep(ctx, currentTree);
314
+ break;
315
+ case 'accessibility':
316
+ if (!currentTree) {
317
+ throw new Error('Accessibility step requires a structure step to run first');
318
+ }
319
+ result = await runAccessibilityStep(currentTree);
320
+ break;
321
+ default: {
322
+ const _exhaustive = step;
323
+ throw new Error(`Unknown generation step: ${_exhaustive}`);
324
+ }
325
+ }
326
+ currentTree = result.tree;
327
+ totalTokensUsed += result.tokensUsed;
328
+ stepResults.push({
329
+ step,
330
+ tree: result.tree,
331
+ metadata: {
332
+ tokensUsed: result.tokensUsed,
333
+ durationMs: Date.now() - stepStart,
334
+ changes: result.changes,
335
+ },
336
+ });
337
+ completedSteps.push(step);
338
+ }
339
+ if (!currentTree) {
340
+ throw new Error('No steps produced a valid page tree');
341
+ }
342
+ return {
343
+ tree: currentTree,
344
+ steps: stepResults,
345
+ totalTokensUsed,
346
+ totalDurationMs: Date.now() - startTime,
347
+ };
348
+ }
349
+ // ─── Block Content Generator ──────────────────────────────────────────
350
+ const BLOCK_CONTENT_SYSTEM_PROMPT = [
351
+ 'You are a web content writer. Generate content data for a single page block.',
352
+ 'Output ONLY a valid JSON object with the appropriate fields for the block type.',
353
+ 'Never include markdown, explanations, or code fences.',
354
+ ].join('\n');
355
+ export async function generateBlockContent(ctx) {
356
+ const provider = requireAIProvider();
357
+ const contextParts = [
358
+ `Generate content for a "${ctx.blockType}" block${ctx.variant ? ` (variant: "${ctx.variant}")` : ''}.`,
359
+ ];
360
+ if (ctx.tone) {
361
+ contextParts.push(`Tone: ${ctx.tone}`);
362
+ }
363
+ if (ctx.pageContext) {
364
+ const pc = ctx.pageContext;
365
+ if (pc.pageTitle)
366
+ contextParts.push(`Page title: ${pc.pageTitle}`);
367
+ if (pc.businessName)
368
+ contextParts.push(`Business: ${pc.businessName}`);
369
+ if (pc.pageTemplate)
370
+ contextParts.push(`Page template: ${pc.pageTemplate}`);
371
+ if (pc.surroundingContent)
372
+ contextParts.push(`Surrounding content context: ${pc.surroundingContent}`);
373
+ }
374
+ contextParts.push('');
375
+ contextParts.push(getBlockFieldReference(ctx.blockType));
376
+ contextParts.push('');
377
+ contextParts.push('Output ONLY the JSON data object for this block. No explanations or markdown.');
378
+ const prompt = contextParts.join('\n');
379
+ const result = await provider.generateText(prompt, {
380
+ maxTokens: 1500,
381
+ temperature: 0.7,
382
+ systemPrompt: BLOCK_CONTENT_SYSTEM_PROMPT,
383
+ });
384
+ const stripped = stripCodeFences(result.text);
385
+ try {
386
+ const parsed = JSON.parse(stripped);
387
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
388
+ return parsed;
389
+ }
390
+ }
391
+ catch {
392
+ const jsonMatch = stripped.match(/\{[\s\S]*\}/);
393
+ if (jsonMatch) {
394
+ try {
395
+ const parsed = JSON.parse(jsonMatch[0]);
396
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
397
+ return parsed;
398
+ }
399
+ }
400
+ catch {
401
+ // Fall through to default
402
+ }
403
+ }
404
+ }
405
+ return {};
406
+ }
407
+ function getBlockFieldReference(blockType) {
408
+ const refs = {
409
+ hero: 'Fields: { title: string, subtitle: string, image: string, videoUrl: string, ctaText: string, ctaLink: string, overlayOpacity: number }',
410
+ text: 'Fields: { body: string (rich text/HTML), heading: string, headingLevel: "h2"|"h3"|"h4" }',
411
+ image: 'Fields: { src: string, alt: string, caption: string, link: string, aspectRatio: string }',
412
+ cards: 'Fields: { items: [{ title: string, description: string, image: string, link: string, icon: string }] }',
413
+ cta: 'Fields: { heading: string, body: string, buttonText: string, buttonLink: string, buttonStyle: string }',
414
+ video: 'Fields: { url: string, poster: string, autoplay: boolean, loop: boolean }',
415
+ gallery: 'Fields: { images: [{ src: string, alt: string, caption: string }] }',
416
+ faq: 'Fields: { items: [{ question: string, answer: string }] }',
417
+ form: 'Fields: { formId: string, successMessage: string }',
418
+ code: 'Fields: { content: string, language: "html"|"javascript"|"css", sandboxed: boolean }',
419
+ };
420
+ return refs[blockType] ?? `Fields: Generate appropriate data fields for a "${blockType}" block.`;
421
+ }
422
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/page-builder/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { generatePage, generateBlockContent } from './generate.js';
2
+ export type { PageGenerationCallbacks, BlockGenerationContext } from './generate.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/page-builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAClE,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { generatePage, generateBlockContent } from './generate.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/page-builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { AIProvider } from "./index.js";
1
+ import type { AIProvider } from './index.js';
2
2
  /** Creates an Anthropic-backed AI provider. */
3
3
  export declare function createAnthropicProvider(config: {
4
4
  apiKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,YAAY,CAAC;AAM7F,+CAA+C;AAC/C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,UAAU,CAyIb"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,YAAY,CAAA;AAM5F,+CAA+C;AAC/C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,UAAU,CA0Ib"}