@actuate-media/cms-core 0.77.3 → 0.79.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 (105) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/__tests__/api/route-contracts.test.js +9 -0
  3. package/dist/__tests__/api/route-contracts.test.js.map +1 -1
  4. package/dist/__tests__/cron/cron.test.js +35 -1
  5. package/dist/__tests__/cron/cron.test.js.map +1 -1
  6. package/dist/__tests__/seo/audit-engine.test.js +16 -1
  7. package/dist/__tests__/seo/audit-engine.test.js.map +1 -1
  8. package/dist/__tests__/seo/audit-signals.test.d.ts +2 -0
  9. package/dist/__tests__/seo/audit-signals.test.d.ts.map +1 -0
  10. package/dist/__tests__/seo/audit-signals.test.js +30 -0
  11. package/dist/__tests__/seo/audit-signals.test.js.map +1 -0
  12. package/dist/__tests__/seo/effective-meta.test.d.ts +2 -0
  13. package/dist/__tests__/seo/effective-meta.test.d.ts.map +1 -0
  14. package/dist/__tests__/seo/effective-meta.test.js +58 -0
  15. package/dist/__tests__/seo/effective-meta.test.js.map +1 -0
  16. package/dist/__tests__/seo/fix-brief-export.test.d.ts +2 -0
  17. package/dist/__tests__/seo/fix-brief-export.test.d.ts.map +1 -0
  18. package/dist/__tests__/seo/fix-brief-export.test.js +153 -0
  19. package/dist/__tests__/seo/fix-brief-export.test.js.map +1 -0
  20. package/dist/__tests__/seo/issue-batch-briefs.test.d.ts +2 -0
  21. package/dist/__tests__/seo/issue-batch-briefs.test.d.ts.map +1 -0
  22. package/dist/__tests__/seo/issue-batch-briefs.test.js +64 -0
  23. package/dist/__tests__/seo/issue-batch-briefs.test.js.map +1 -0
  24. package/dist/__tests__/seo/issue-content-brief.test.d.ts +2 -0
  25. package/dist/__tests__/seo/issue-content-brief.test.d.ts.map +1 -0
  26. package/dist/__tests__/seo/issue-content-brief.test.js +107 -0
  27. package/dist/__tests__/seo/issue-content-brief.test.js.map +1 -0
  28. package/dist/__tests__/seo/issue-content-research.test.d.ts +2 -0
  29. package/dist/__tests__/seo/issue-content-research.test.d.ts.map +1 -0
  30. package/dist/__tests__/seo/issue-content-research.test.js +114 -0
  31. package/dist/__tests__/seo/issue-content-research.test.js.map +1 -0
  32. package/dist/__tests__/seo/issue-fix-ai.test.d.ts +2 -0
  33. package/dist/__tests__/seo/issue-fix-ai.test.d.ts.map +1 -0
  34. package/dist/__tests__/seo/issue-fix-ai.test.js +96 -0
  35. package/dist/__tests__/seo/issue-fix-ai.test.js.map +1 -0
  36. package/dist/__tests__/seo/issue-fix-orchestrator.test.d.ts +2 -0
  37. package/dist/__tests__/seo/issue-fix-orchestrator.test.d.ts.map +1 -0
  38. package/dist/__tests__/seo/issue-fix-orchestrator.test.js +48 -0
  39. package/dist/__tests__/seo/issue-fix-orchestrator.test.js.map +1 -0
  40. package/dist/__tests__/seo/issue-fix.test.d.ts +2 -0
  41. package/dist/__tests__/seo/issue-fix.test.d.ts.map +1 -0
  42. package/dist/__tests__/seo/issue-fix.test.js +98 -0
  43. package/dist/__tests__/seo/issue-fix.test.js.map +1 -0
  44. package/dist/__tests__/seo/migrate-meta.test.d.ts +2 -0
  45. package/dist/__tests__/seo/migrate-meta.test.d.ts.map +1 -0
  46. package/dist/__tests__/seo/migrate-meta.test.js +75 -0
  47. package/dist/__tests__/seo/migrate-meta.test.js.map +1 -0
  48. package/dist/api/routes/seo.d.ts.map +1 -1
  49. package/dist/api/routes/seo.js +677 -1
  50. package/dist/api/routes/seo.js.map +1 -1
  51. package/dist/cron/index.d.ts.map +1 -1
  52. package/dist/cron/index.js +19 -2
  53. package/dist/cron/index.js.map +1 -1
  54. package/dist/index.d.ts +1 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/seo/audit-engine.d.ts.map +1 -1
  59. package/dist/seo/audit-engine.js +107 -0
  60. package/dist/seo/audit-engine.js.map +1 -1
  61. package/dist/seo/audit-runner.d.ts +2 -1
  62. package/dist/seo/audit-runner.d.ts.map +1 -1
  63. package/dist/seo/audit-runner.js +32 -18
  64. package/dist/seo/audit-runner.js.map +1 -1
  65. package/dist/seo/audit-signals.d.ts +20 -0
  66. package/dist/seo/audit-signals.d.ts.map +1 -0
  67. package/dist/seo/audit-signals.js +107 -0
  68. package/dist/seo/audit-signals.js.map +1 -0
  69. package/dist/seo/fix-brief-export.d.ts +47 -0
  70. package/dist/seo/fix-brief-export.d.ts.map +1 -0
  71. package/dist/seo/fix-brief-export.js +224 -0
  72. package/dist/seo/fix-brief-export.js.map +1 -0
  73. package/dist/seo/index.d.ts +17 -1
  74. package/dist/seo/index.d.ts.map +1 -1
  75. package/dist/seo/index.js +9 -1
  76. package/dist/seo/index.js.map +1 -1
  77. package/dist/seo/issue-batch-briefs.d.ts +37 -0
  78. package/dist/seo/issue-batch-briefs.d.ts.map +1 -0
  79. package/dist/seo/issue-batch-briefs.js +85 -0
  80. package/dist/seo/issue-batch-briefs.js.map +1 -0
  81. package/dist/seo/issue-content-brief.d.ts +51 -0
  82. package/dist/seo/issue-content-brief.d.ts.map +1 -0
  83. package/dist/seo/issue-content-brief.js +265 -0
  84. package/dist/seo/issue-content-brief.js.map +1 -0
  85. package/dist/seo/issue-content-research.d.ts +51 -0
  86. package/dist/seo/issue-content-research.d.ts.map +1 -0
  87. package/dist/seo/issue-content-research.js +301 -0
  88. package/dist/seo/issue-content-research.js.map +1 -0
  89. package/dist/seo/issue-fix-ai.d.ts +39 -0
  90. package/dist/seo/issue-fix-ai.d.ts.map +1 -0
  91. package/dist/seo/issue-fix-ai.js +298 -0
  92. package/dist/seo/issue-fix-ai.js.map +1 -0
  93. package/dist/seo/issue-fix.d.ts +68 -0
  94. package/dist/seo/issue-fix.d.ts.map +1 -0
  95. package/dist/seo/issue-fix.js +244 -0
  96. package/dist/seo/issue-fix.js.map +1 -0
  97. package/dist/seo/migrate-meta.d.ts +23 -0
  98. package/dist/seo/migrate-meta.d.ts.map +1 -0
  99. package/dist/seo/migrate-meta.js +113 -0
  100. package/dist/seo/migrate-meta.js.map +1 -0
  101. package/dist/seo/page-meta.d.ts +24 -1
  102. package/dist/seo/page-meta.d.ts.map +1 -1
  103. package/dist/seo/page-meta.js +59 -1
  104. package/dist/seo/page-meta.js.map +1 -1
  105. package/package.json +1 -1
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Markdown export for SEO issues that require human / dev-team follow-up
3
+ * (headings, thin content, broken links, etc.) — Phase A handoff artifact.
4
+ */
5
+ import { AI_FIX_TYPES } from './issue-fix-ai.js';
6
+ import { DETERMINISTIC_FIX_TYPES } from './issue-fix.js';
7
+ import { renderContentBriefMarkdown } from './issue-content-brief.js';
8
+ import { renderContentResearchMarkdown } from './issue-content-research.js';
9
+ /** Issue types handled by inline Approve fix (deterministic + AI). */
10
+ export const INLINE_FIX_ISSUE_TYPES = new Set([...DETERMINISTIC_FIX_TYPES, ...AI_FIX_TYPES]);
11
+ const METADATA_FIX_ACTIONS = new Set([
12
+ 'edit-metadata',
13
+ 'edit-canonical',
14
+ 'edit-og',
15
+ 'edit-og-image',
16
+ 'edit-schema',
17
+ ]);
18
+ /**
19
+ * True when an issue should be handed off via export rather than inline approve.
20
+ */
21
+ export function isManualHandoffIssue(issue) {
22
+ if (INLINE_FIX_ISSUE_TYPES.has(issue.type))
23
+ return false;
24
+ if (issue.fixActionType === 'edit-content')
25
+ return true;
26
+ if (!issue.fixable)
27
+ return true;
28
+ if (issue.fixActionType && !METADATA_FIX_ACTIONS.has(issue.fixActionType))
29
+ return true;
30
+ return false;
31
+ }
32
+ export function filterFixBriefIssues(issues, manualOnly = true) {
33
+ if (!manualOnly)
34
+ return issues;
35
+ return issues.filter(isManualHandoffIssue);
36
+ }
37
+ function formatAuditDate(value) {
38
+ if (!value)
39
+ return 'Unknown';
40
+ const d = value instanceof Date ? value : new Date(value);
41
+ if (Number.isNaN(d.getTime()))
42
+ return 'Unknown';
43
+ return d.toLocaleString('en-US', { dateStyle: 'medium', timeStyle: 'short' });
44
+ }
45
+ function sanitizeFilenamePart(value) {
46
+ return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'site';
47
+ }
48
+ export function fixBriefFilename(siteName, auditDate) {
49
+ const site = sanitizeFilenamePart(siteName ?? 'seo');
50
+ const d = auditDate instanceof Date ? auditDate : auditDate ? new Date(auditDate) : new Date();
51
+ const stamp = Number.isNaN(d.getTime()) ? 'undated' : d.toISOString().slice(0, 10);
52
+ return `${site}-seo-fix-brief-${stamp}.md`;
53
+ }
54
+ /** Relative admin path for opening the page/editor (consumer resolves basePath). */
55
+ export function adminPathForIssue(issue) {
56
+ const id = issue.entityId;
57
+ if (!id) {
58
+ if (issue.fixActionType === 'fix-link' || issue.fixActionType === 'create-redirect') {
59
+ return '/seo?tab=redirects';
60
+ }
61
+ if (issue.fixActionType === 'improve-speed')
62
+ return '/seo?tab=technical';
63
+ if (issue.fixActionType === 'optimize-media')
64
+ return '/media';
65
+ return null;
66
+ }
67
+ switch (issue.fixActionType) {
68
+ case 'edit-metadata':
69
+ case 'edit-canonical':
70
+ case 'edit-og':
71
+ case 'edit-og-image':
72
+ case 'edit-schema':
73
+ if (issue.entityType) {
74
+ return `/seo?tab=content&entityType=${issue.entityType}&entityId=${encodeURIComponent(id)}`;
75
+ }
76
+ break;
77
+ case 'edit-content':
78
+ if (issue.entityType === 'page')
79
+ return `/pages/${id}`;
80
+ if (issue.entityType === 'post') {
81
+ return `/seo?tab=content&entityType=post&entityId=${encodeURIComponent(id)}`;
82
+ }
83
+ break;
84
+ case 'fix-link':
85
+ case 'create-redirect':
86
+ return '/seo?tab=redirects';
87
+ case 'optimize-media':
88
+ return '/media';
89
+ case 'improve-speed':
90
+ return '/seo?tab=technical';
91
+ default:
92
+ if (issue.entityType === 'page')
93
+ return `/pages/${id}`;
94
+ if (issue.entityType) {
95
+ return `/seo?tab=content&entityType=${issue.entityType}&entityId=${encodeURIComponent(id)}`;
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+ function groupKey(issue) {
101
+ if (issue.entityType && issue.entityId)
102
+ return `${issue.entityType}:${issue.entityId}`;
103
+ return `site:${issue.url ?? issue.id}`;
104
+ }
105
+ function severityRank(severity) {
106
+ switch (severity) {
107
+ case 'critical':
108
+ return 0;
109
+ case 'warning':
110
+ return 1;
111
+ default:
112
+ return 2;
113
+ }
114
+ }
115
+ function sortIssues(issues) {
116
+ return [...issues].sort((a, b) => {
117
+ const sr = severityRank(a.severity) - severityRank(b.severity);
118
+ if (sr !== 0)
119
+ return sr;
120
+ return a.title.localeCompare(b.title);
121
+ });
122
+ }
123
+ function renderIssueBlock(issue, index) {
124
+ const lines = [];
125
+ lines.push(`### ${index}. ${issue.title}`);
126
+ lines.push('');
127
+ lines.push(`- **Severity:** ${issue.severity} | **Category:** ${issue.category} | **Status:** ${issue.status}`);
128
+ lines.push(`- **Issue ID:** \`${issue.id}\` _(use to mark resolved in Admin → SEO → Audit)_`);
129
+ if (issue.impact)
130
+ lines.push(`- **Impact:** ${issue.impact}`);
131
+ if (issue.description)
132
+ lines.push(`- **Why:** ${issue.description}`);
133
+ if (issue.recommendation)
134
+ lines.push(`- **Fix:** ${issue.recommendation}`);
135
+ const adminPath = adminPathForIssue(issue);
136
+ if (adminPath)
137
+ lines.push(`- **Admin:** \`${adminPath}\``);
138
+ if (issue.contentResearch) {
139
+ lines.push('');
140
+ lines.push(renderContentResearchMarkdown(issue.contentResearch).trimEnd());
141
+ }
142
+ if (issue.contentBrief) {
143
+ lines.push('');
144
+ lines.push(renderContentBriefMarkdown(issue.contentBrief).trimEnd());
145
+ }
146
+ lines.push('');
147
+ return lines.join('\n');
148
+ }
149
+ /**
150
+ * Build a developer handoff markdown document from open audit issues.
151
+ */
152
+ export function buildSeoFixBriefMarkdown(input) {
153
+ const manualOnly = input.manualOnly !== false;
154
+ const filtered = filterFixBriefIssues(input.issues, manualOnly);
155
+ const siteLabel = input.siteName?.trim() || input.siteUrl?.trim() || 'Site';
156
+ const auditLabel = formatAuditDate(input.auditDate);
157
+ const scopeLabel = manualOnly ? 'manual fixes' : 'all listed issues';
158
+ const header = [
159
+ '# SEO Content Fix Brief',
160
+ '',
161
+ `**Site:** ${siteLabel}${input.siteUrl ? ` (${input.siteUrl})` : ''}`,
162
+ `**Audit date:** ${auditLabel}${input.auditRunId ? ` | **Run ID:** \`${input.auditRunId}\`` : ''}`,
163
+ `**${scopeLabel.charAt(0).toUpperCase() + scopeLabel.slice(1)} in this export:** ${filtered.length}`,
164
+ '',
165
+ '## How to use this document',
166
+ '',
167
+ '1. Work through each page section below in the CMS or codebase.',
168
+ '2. Re-run **SEO → Run audit** to verify fixes.',
169
+ '3. Mark issues resolved in **Admin → SEO → Audit** (use the Issue ID on each item).',
170
+ '',
171
+ ];
172
+ if (filtered.length === 0) {
173
+ return [
174
+ ...header,
175
+ '_No issues match this export filter. Try turning off “manual only” or adjust audit filters._',
176
+ '',
177
+ ].join('\n');
178
+ }
179
+ const groups = new Map();
180
+ for (const issue of filtered) {
181
+ const key = groupKey(issue);
182
+ const arr = groups.get(key) ?? [];
183
+ arr.push(issue);
184
+ groups.set(key, arr);
185
+ }
186
+ const sections = [];
187
+ let sectionNum = 0;
188
+ const sortedGroups = [...groups.entries()].sort(([, aIssues], [, bIssues]) => {
189
+ const aMin = Math.min(...aIssues.map((i) => severityRank(i.severity)));
190
+ const bMin = Math.min(...bIssues.map((i) => severityRank(i.severity)));
191
+ if (aMin !== bMin)
192
+ return aMin - bMin;
193
+ const aTitle = aIssues[0]?.entityTitle ?? aIssues[0]?.url ?? '';
194
+ const bTitle = bIssues[0]?.entityTitle ?? bIssues[0]?.url ?? '';
195
+ return aTitle.localeCompare(bTitle);
196
+ });
197
+ for (const [, groupIssues] of sortedGroups) {
198
+ sectionNum += 1;
199
+ const sorted = sortIssues(groupIssues);
200
+ const first = sorted[0];
201
+ const pageTitle = first.entityTitle?.trim() || first.url?.trim() || 'Site-wide issue';
202
+ const pageUrl = first.url?.trim();
203
+ sections.push(`## ${sectionNum}. ${pageTitle}`);
204
+ sections.push('');
205
+ if (pageUrl)
206
+ sections.push(`- **URL:** ${pageUrl}`);
207
+ if (first.entityType && first.entityId) {
208
+ sections.push(`- **Entity:** ${first.entityType} \`${first.entityId}\``);
209
+ }
210
+ const pageAdmin = first.entityId && first.entityType === 'page'
211
+ ? `/pages/${first.entityId}`
212
+ : adminPathForIssue(first);
213
+ if (pageAdmin)
214
+ sections.push(`- **Open in admin:** \`${pageAdmin}\``);
215
+ sections.push('');
216
+ let issueIndex = 0;
217
+ for (const issue of sorted) {
218
+ issueIndex += 1;
219
+ sections.push(renderIssueBlock(issue, issueIndex));
220
+ }
221
+ }
222
+ return [...header, ...sections].join('\n');
223
+ }
224
+ //# sourceMappingURL=fix-brief-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-brief-export.js","sourceRoot":"","sources":["../../src/seo/fix-brief-export.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,8 @@ export { selectLlmsDocs, toLlmsPage, readLlmsInclude, isLlmsNoindex } from './ll
13
13
  export { matchPathToCollection } from './resolve-path.js';
14
14
  export type { PathMatch } from './resolve-path.js';
15
15
  export type { LlmsTxtConfig, LlmsTxtPage } from './llms-txt.js';
16
- export { composePageMeta, detectSchemaType, resolveContentDates, resolveEffectiveCanonicalUrl, } from './page-meta.js';
16
+ export { composePageMeta, detectSchemaType, resolveContentDates, resolveEffectiveCanonicalUrl, resolveEffectiveMeta, } from './page-meta.js';
17
+ export type { EffectiveMeta, ResolveEffectiveMetaParams } from './page-meta.js';
17
18
  export { applyStructuredDataFieldsToData, composeStructuredDataForPublish, isPublicContentCollection, prepareContentStructuredData, resolveEffectiveSchemaType, syncSchemaTypeFields, } from './schema-sync.js';
18
19
  export type { ContentStructuredDataPrep } from './schema-sync.js';
19
20
  export type { ComposePageMetaInput, ComposedPageMeta, ComposeDocumentInput } from './page-meta.js';
@@ -36,7 +37,22 @@ export type { AuditEntityInput, AuditExtraSignals, DetectedIssue, AuditPageRecor
36
37
  export { runAndPersistAudit, gatherAuditEntities, documentToAuditEntity, frontEndContentCollectionTypes, isInternalCollection, } from './audit-runner.js';
37
38
  export { migrateStructuredDataFields } from './migrate-schema.js';
38
39
  export type { MigrateStructuredDataOptions, MigrateStructuredDataResult } from './migrate-schema.js';
40
+ export { migrateMetaFields } from './migrate-meta.js';
41
+ export type { MigrateMetaOptions, MigrateMetaResult } from './migrate-meta.js';
42
+ export { gatherAuditSignals, gatherRedirectSignals, detectBrokenInternalLinks, } from './audit-signals.js';
39
43
  export type { ContentCollectionTypes } from './audit-runner.js';
40
44
  export { computeSiteIndexStatus, getSiteIndexStatus, robotsTxtBlocksEntireSite, } from './index-status.js';
41
45
  export type { SiteIndexStatus, IndexStatusLevel, IndexStatusSeverity, IndexCheck, IndexCheckStatus, IndexAction, IndexStatusInputs, } from './index-status.js';
46
+ export { suggestDeterministicFix, suggestIssueFix, truncateAtWordBoundary, excerptForMetaDescription, buildFixFingerprint, DETERMINISTIC_FIX_TYPES, META_TITLE_MAX, META_TITLE_MIN, META_DESC_MAX, META_DESC_MIN, } from './issue-fix.js';
47
+ export type { SeoFixFieldChange, SeoIssueFixSuggestion, SeoIssueFixInput, SeoIssueFixContext, SuggestIssueFixResult, } from './issue-fix.js';
48
+ export { suggestAiFix, AI_FIX_TYPES, pendingFixFromMetadata, pendingFixToMetadata, } from './issue-fix-ai.js';
49
+ export type { AiFixDeps, AiFixResult, PendingFixCache } from './issue-fix-ai.js';
50
+ export { buildSeoFixBriefMarkdown, filterFixBriefIssues, fixBriefFilename, isManualHandoffIssue, adminPathForIssue, INLINE_FIX_ISSUE_TYPES, } from './fix-brief-export.js';
51
+ export type { FixBriefIssue, FixBriefExportInput } from './fix-brief-export.js';
52
+ export { generateContentBrief, supportsContentBrief, contentBriefFromMetadata, contentBriefToMetadata, renderContentBriefMarkdown, CONTENT_BRIEF_ISSUE_TYPES, } from './issue-content-brief.js';
53
+ export type { SeoContentBrief, SeoContentBriefSection, ContentBriefIssueInput, ContentBriefContext, ContentBriefResult, } from './issue-content-brief.js';
54
+ export { generateContentResearch, supportsContentResearch, contentResearchFromMetadata, contentResearchToMetadata, renderContentResearchMarkdown, RESEARCH_ISSUE_TYPES, MAX_COMPETITOR_URLS, } from './issue-content-research.js';
55
+ export type { SeoContentResearch, SeoContentResearchCompetitor, ContentResearchIssueInput, ContentResearchContext, ContentResearchResult, } from './issue-content-research.js';
56
+ export { batchGenerateContentBriefs, BATCH_BRIEF_MAX_ISSUES, BATCH_BRIEF_CONCURRENCY, } from './issue-batch-briefs.js';
57
+ export type { BatchBriefIssueRow, BatchBriefEntityContext, BatchBriefOptions, BatchBriefItemResult, BatchBriefResult, } from './issue-batch-briefs.js';
42
58
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"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"}
package/dist/seo/index.js CHANGED
@@ -6,7 +6,7 @@ export { generateLlmsTxt, sanitizeLlmsText } from './llms-txt.js';
6
6
  export { documentToMarkdown, htmlToMarkdown } from './content-markdown.js';
7
7
  export { selectLlmsDocs, toLlmsPage, readLlmsInclude, isLlmsNoindex } from './llms-select.js';
8
8
  export { matchPathToCollection } from './resolve-path.js';
9
- export { composePageMeta, detectSchemaType, resolveContentDates, resolveEffectiveCanonicalUrl, } from './page-meta.js';
9
+ export { composePageMeta, detectSchemaType, resolveContentDates, resolveEffectiveCanonicalUrl, resolveEffectiveMeta, } from './page-meta.js';
10
10
  export { applyStructuredDataFieldsToData, composeStructuredDataForPublish, isPublicContentCollection, prepareContentStructuredData, resolveEffectiveSchemaType, syncSchemaTypeFields, } from './schema-sync.js';
11
11
  export { analyzeImageAlts, countMissingAltImages, isDecorativeImgTag } from './alt-text.js';
12
12
  export { buildRssFeed, buildJsonFeed } from './feeds.js';
@@ -18,5 +18,13 @@ export { calculatePageSeoScore, calculateSiteSeoScore, gradeForSeoScore, countH1
18
18
  export { runSeoAuditAnalysis, buildQuickWins, issueKeyFor } from './audit-engine.js';
19
19
  export { runAndPersistAudit, gatherAuditEntities, documentToAuditEntity, frontEndContentCollectionTypes, isInternalCollection, } from './audit-runner.js';
20
20
  export { migrateStructuredDataFields } from './migrate-schema.js';
21
+ export { migrateMetaFields } from './migrate-meta.js';
22
+ export { gatherAuditSignals, gatherRedirectSignals, detectBrokenInternalLinks, } from './audit-signals.js';
21
23
  export { computeSiteIndexStatus, getSiteIndexStatus, robotsTxtBlocksEntireSite, } from './index-status.js';
24
+ export { suggestDeterministicFix, suggestIssueFix, truncateAtWordBoundary, excerptForMetaDescription, buildFixFingerprint, DETERMINISTIC_FIX_TYPES, META_TITLE_MAX, META_TITLE_MIN, META_DESC_MAX, META_DESC_MIN, } from './issue-fix.js';
25
+ export { suggestAiFix, AI_FIX_TYPES, pendingFixFromMetadata, pendingFixToMetadata, } from './issue-fix-ai.js';
26
+ export { buildSeoFixBriefMarkdown, filterFixBriefIssues, fixBriefFilename, isManualHandoffIssue, adminPathForIssue, INLINE_FIX_ISSUE_TYPES, } from './fix-brief-export.js';
27
+ export { generateContentBrief, supportsContentBrief, contentBriefFromMetadata, contentBriefToMetadata, renderContentBriefMarkdown, CONTENT_BRIEF_ISSUE_TYPES, } from './issue-content-brief.js';
28
+ export { generateContentResearch, supportsContentResearch, contentResearchFromMetadata, contentResearchToMetadata, renderContentResearchMarkdown, RESEARCH_ISSUE_TYPES, MAX_COMPETITOR_URLS, } from './issue-content-research.js';
29
+ export { batchGenerateContentBriefs, BATCH_BRIEF_MAX_ISSUES, BATCH_BRIEF_CONCURRENCY, } from './issue-batch-briefs.js';
22
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAA;AAItB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,gBAAgB,CAAA;AAIvB,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAI5E,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAA;AAS7B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAE1E,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAKzD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AAMzB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAI3F,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAIxD,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAIpF,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,mBAAmB,CAAA;AAI1B,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAA;AAS5B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAA;AAanB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAWpF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AAIjE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAA;AAItB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,gBAAgB,CAAA;AAIvB,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAI5E,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAA;AAS7B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAE1E,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAKzD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAIvB,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AAMzB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAI3F,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAIxD,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAIpF,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,mBAAmB,CAAA;AAI1B,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAA;AAS5B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAA;AAanB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAWpF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AAEjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA;AAY1B,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,gBAAgB,CAAA;AAUvB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,0BAA0B,CAAA;AASjC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AASpC,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,37 @@
1
+ import type { AiFixDeps } from './issue-fix-ai.js';
2
+ import type { AuditEntityInput } from './audit-engine.js';
3
+ export declare const BATCH_BRIEF_MAX_ISSUES = 15;
4
+ export declare const BATCH_BRIEF_CONCURRENCY = 2;
5
+ export interface BatchBriefIssueRow {
6
+ id: string;
7
+ type: string;
8
+ title: string;
9
+ description?: string | null;
10
+ recommendation?: string | null;
11
+ entityId?: string | null;
12
+ entityType?: string | null;
13
+ metadata?: unknown;
14
+ }
15
+ export interface BatchBriefEntityContext {
16
+ entity: AuditEntityInput;
17
+ updatedAt: Date;
18
+ collection: string;
19
+ }
20
+ export interface BatchBriefOptions {
21
+ skipExisting?: boolean;
22
+ includeResearch?: boolean;
23
+ competitorUrls?: string[];
24
+ }
25
+ export interface BatchBriefItemResult {
26
+ issueId: string;
27
+ status: 'generated' | 'skipped' | 'failed';
28
+ error?: string;
29
+ }
30
+ export interface BatchBriefResult {
31
+ generated: number;
32
+ skipped: number;
33
+ failed: number;
34
+ results: BatchBriefItemResult[];
35
+ }
36
+ export declare function batchGenerateContentBriefs(issues: BatchBriefIssueRow[], contexts: Map<string, BatchBriefEntityContext>, deps: AiFixDeps, options?: BatchBriefOptions): Promise<BatchBriefResult>;
37
+ //# sourceMappingURL=issue-batch-briefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-batch-briefs.d.ts","sourceRoot":"","sources":["../../src/seo/issue-batch-briefs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAelD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAExC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,gBAAgB,CAAA;IACxB,SAAS,EAAE,IAAI,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAA;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,oBAAoB,EAAE,CAAA;CAChC;AA2BD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,kBAAkB,EAAE,EAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,EAC9C,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAwF3B"}
@@ -0,0 +1,85 @@
1
+ import { contentBriefFromMetadata, contentBriefToMetadata, generateContentBrief, supportsContentBrief, } from './issue-content-brief.js';
2
+ import { contentResearchFromMetadata, contentResearchToMetadata, generateContentResearch, supportsContentResearch, } from './issue-content-research.js';
3
+ export const BATCH_BRIEF_MAX_ISSUES = 15;
4
+ export const BATCH_BRIEF_CONCURRENCY = 2;
5
+ function asRecord(value) {
6
+ if (!value || typeof value !== 'object' || Array.isArray(value))
7
+ return {};
8
+ return value;
9
+ }
10
+ async function mapWithConcurrency(items, concurrency, fn) {
11
+ const results = new Array(items.length);
12
+ let index = 0;
13
+ async function worker() {
14
+ while (index < items.length) {
15
+ const i = index++;
16
+ results[i] = await fn(items[i]);
17
+ }
18
+ }
19
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, () => worker());
20
+ await Promise.all(workers);
21
+ return results;
22
+ }
23
+ export async function batchGenerateContentBriefs(issues, contexts, deps, options = {}) {
24
+ const skipExisting = options.skipExisting !== false;
25
+ const includeResearch = options.includeResearch === true;
26
+ const capped = issues.filter((i) => supportsContentBrief(i.type)).slice(0, BATCH_BRIEF_MAX_ISSUES);
27
+ const results = await mapWithConcurrency(capped, BATCH_BRIEF_CONCURRENCY, async (issue) => {
28
+ if (!issue.entityId) {
29
+ return { issueId: issue.id, status: 'failed', error: 'Not linked to content.' };
30
+ }
31
+ const ctx = contexts.get(issue.entityId);
32
+ if (!ctx) {
33
+ return { issueId: issue.id, status: 'failed', error: 'Content not found.' };
34
+ }
35
+ if (skipExisting) {
36
+ const existing = contentBriefFromMetadata(issue.metadata, issue.type, issue.entityId, ctx.updatedAt);
37
+ if (existing) {
38
+ return { issueId: issue.id, status: 'skipped' };
39
+ }
40
+ }
41
+ let research = null;
42
+ if (includeResearch && supportsContentResearch(issue.type)) {
43
+ const cachedResearch = contentResearchFromMetadata(issue.metadata, issue.type, issue.entityId, ctx.updatedAt);
44
+ if (cachedResearch) {
45
+ research = cachedResearch;
46
+ }
47
+ else {
48
+ const researchResult = await generateContentResearch(issue, { entity: ctx.entity, updatedAt: ctx.updatedAt }, { ...deps, collection: ctx.collection }, { competitorUrls: options.competitorUrls });
49
+ if (!researchResult.ok) {
50
+ return { issueId: issue.id, status: 'failed', error: researchResult.message };
51
+ }
52
+ research = researchResult.research;
53
+ }
54
+ }
55
+ const briefResult = await generateContentBrief(issue, { entity: ctx.entity, updatedAt: ctx.updatedAt }, { ...deps, collection: ctx.collection }, research ? { research } : undefined);
56
+ if (!briefResult.ok) {
57
+ return { issueId: issue.id, status: 'failed', error: briefResult.message };
58
+ }
59
+ const metaPatch = {
60
+ ...asRecord(issue.metadata),
61
+ ...contentBriefToMetadata(briefResult.brief),
62
+ };
63
+ if (research) {
64
+ Object.assign(metaPatch, contentResearchToMetadata(research));
65
+ }
66
+ await deps.db.seoIssue.update({
67
+ where: { id: issue.id },
68
+ data: { metadata: metaPatch },
69
+ });
70
+ return { issueId: issue.id, status: 'generated' };
71
+ });
72
+ let generated = 0;
73
+ let skipped = 0;
74
+ let failed = 0;
75
+ for (const r of results) {
76
+ if (r.status === 'generated')
77
+ generated++;
78
+ else if (r.status === 'skipped')
79
+ skipped++;
80
+ else
81
+ failed++;
82
+ }
83
+ return { generated, skipped, failed, results };
84
+ }
85
+ //# sourceMappingURL=issue-batch-briefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-batch-briefs.js","sourceRoot":"","sources":["../../src/seo/issue-batch-briefs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { AuditEntityInput } from './audit-engine.js';
2
+ import type { AiFixDeps } from './issue-fix-ai.js';
3
+ import type { SeoContentResearch } from './issue-content-research.js';
4
+ export declare const CONTENT_BRIEF_ISSUE_TYPES: Set<string>;
5
+ export interface SeoContentBriefSection {
6
+ heading: string;
7
+ bullets: string[];
8
+ }
9
+ export interface SeoContentBrief {
10
+ issueType: string;
11
+ entityId: string;
12
+ fingerprint: string;
13
+ generatedAt: string;
14
+ summary: string;
15
+ suggestedH1: string | null;
16
+ targetWordCount: number | null;
17
+ topics: string[];
18
+ sections: SeoContentBriefSection[];
19
+ keyTakeawayDraft: string | null;
20
+ geoNote: string | null;
21
+ aiUnavailable?: boolean;
22
+ }
23
+ export interface ContentBriefIssueInput {
24
+ id: string;
25
+ type: string;
26
+ title: string;
27
+ description?: string | null;
28
+ recommendation?: string | null;
29
+ entityId?: string | null;
30
+ }
31
+ export interface ContentBriefContext {
32
+ entity: AuditEntityInput;
33
+ updatedAt: string | Date;
34
+ }
35
+ export type ContentBriefResult = {
36
+ ok: true;
37
+ brief: SeoContentBrief;
38
+ } | {
39
+ ok: false;
40
+ code: 'unsupported' | 'unavailable' | 'rate_limited' | 'feature_disabled' | 'error';
41
+ message: string;
42
+ };
43
+ export declare function supportsContentBrief(issueType: string): boolean;
44
+ export declare function contentBriefFromMetadata(metadata: unknown, issueType: string, entityId: string, updatedAt: string | Date): SeoContentBrief | null;
45
+ export declare function contentBriefToMetadata(brief: SeoContentBrief): Record<string, unknown>;
46
+ export declare function generateContentBrief(issue: ContentBriefIssueInput, ctx: ContentBriefContext, deps: AiFixDeps, options?: {
47
+ research?: SeoContentResearch | null;
48
+ }): Promise<ContentBriefResult>;
49
+ /** Render a content brief as markdown for export handoff docs. */
50
+ export declare function renderContentBriefMarkdown(brief: SeoContentBrief): string;
51
+ //# sourceMappingURL=issue-content-brief.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-content-brief.d.ts","sourceRoot":"","sources":["../../src/seo/issue-content-brief.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,eAAO,MAAM,yBAAyB,aAKpC,CAAA;AAKF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,sBAAsB,EAAE,CAAA;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,CAAA;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACpC;IACE,EAAE,EAAE,KAAK,CAAA;IACT,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,kBAAkB,GAAG,OAAO,CAAA;IACnF,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAiFL,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,eAAe,GAAG,IAAI,CAqBxB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEtF;AA6BD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,sBAAsB,EAC7B,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,SAAS,EACf,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;CAAE,GACjD,OAAO,CAAC,kBAAkB,CAAC,CAoG7B;AAED,kEAAkE;AAClE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAkBzE"}