@actuate-media/plugin-ai 0.1.0 → 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.
- package/LICENSE +21 -21
- package/dist/__tests__/content-generator.test.d.ts +2 -0
- package/dist/__tests__/content-generator.test.d.ts.map +1 -0
- package/dist/__tests__/content-generator.test.js +200 -0
- package/dist/__tests__/content-generator.test.js.map +1 -0
- package/dist/__tests__/index.test.js.map +1 -1
- package/dist/admin/AIScorePanel.d.ts +1 -1
- package/dist/admin/AIScorePanel.d.ts.map +1 -1
- package/dist/admin/AIScorePanel.js +34 -17
- package/dist/admin/AIScorePanel.js.map +1 -1
- package/dist/admin/BrandVoiceSettings.d.ts +2 -2
- package/dist/admin/BrandVoiceSettings.d.ts.map +1 -1
- package/dist/admin/BrandVoiceSettings.js +123 -34
- package/dist/admin/BrandVoiceSettings.js.map +1 -1
- package/dist/admin/ContentScoreDashboard.d.ts +1 -1
- package/dist/admin/ContentScoreDashboard.d.ts.map +1 -1
- package/dist/admin/ContentScoreDashboard.js +50 -16
- package/dist/admin/ContentScoreDashboard.js.map +1 -1
- package/dist/admin/WritingAssistantToolbar.d.ts.map +1 -1
- package/dist/admin/WritingAssistantToolbar.js +21 -21
- package/dist/admin/WritingAssistantToolbar.js.map +1 -1
- package/dist/brand/consistency-checker.d.ts +3 -3
- package/dist/brand/consistency-checker.d.ts.map +1 -1
- package/dist/brand/consistency-checker.js +7 -7
- package/dist/brand/consistency-checker.js.map +1 -1
- package/dist/brand/profile-builder.d.ts +2 -2
- package/dist/brand/profile-builder.d.ts.map +1 -1
- package/dist/brand/profile-builder.js +20 -19
- package/dist/brand/profile-builder.js.map +1 -1
- package/dist/brand/voice-profile.d.ts +4 -4
- package/dist/brand/voice-profile.d.ts.map +1 -1
- package/dist/collections.d.ts +1 -1
- package/dist/collections.d.ts.map +1 -1
- package/dist/collections.js.map +1 -1
- package/dist/fields.d.ts +1 -1
- package/dist/fields.d.ts.map +1 -1
- package/dist/fields.js.map +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +16 -14
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +33 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -35
- package/dist/index.js.map +1 -1
- package/dist/links/smart-links.d.ts.map +1 -1
- package/dist/links/smart-links.js +2 -2
- package/dist/links/smart-links.js.map +1 -1
- package/dist/media/alt-text-generator.d.ts +2 -2
- package/dist/media/alt-text-generator.d.ts.map +1 -1
- package/dist/media/alt-text-generator.js +14 -9
- package/dist/media/alt-text-generator.js.map +1 -1
- package/dist/media/auto-tagger.d.ts +1 -1
- package/dist/media/auto-tagger.d.ts.map +1 -1
- package/dist/media/auto-tagger.js +8 -5
- package/dist/media/auto-tagger.js.map +1 -1
- package/dist/page-builder/generate.d.ts.map +1 -1
- package/dist/page-builder/generate.js +106 -87
- package/dist/page-builder/generate.js.map +1 -1
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +32 -32
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -6
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +24 -24
- package/dist/providers/openai.js.map +1 -1
- package/dist/scoring/accessibility.d.ts +1 -1
- package/dist/scoring/accessibility.d.ts.map +1 -1
- package/dist/scoring/accessibility.js +22 -22
- package/dist/scoring/accessibility.js.map +1 -1
- package/dist/scoring/brand-alignment.d.ts +1 -1
- package/dist/scoring/brand-alignment.d.ts.map +1 -1
- package/dist/scoring/brand-alignment.js +14 -12
- package/dist/scoring/brand-alignment.js.map +1 -1
- package/dist/scoring/composite.d.ts +1 -1
- package/dist/scoring/composite.d.ts.map +1 -1
- package/dist/scoring/composite.js +5 -5
- package/dist/scoring/composite.js.map +1 -1
- package/dist/scoring/freshness.d.ts +1 -1
- package/dist/scoring/freshness.d.ts.map +1 -1
- package/dist/scoring/freshness.js +5 -7
- package/dist/scoring/freshness.js.map +1 -1
- package/dist/scoring/readability.d.ts +1 -1
- package/dist/scoring/readability.d.ts.map +1 -1
- package/dist/scoring/readability.js +8 -8
- package/dist/scoring/readability.js.map +1 -1
- package/dist/scoring/seo-score.d.ts.map +1 -1
- package/dist/scoring/seo-score.js +82 -16
- package/dist/scoring/seo-score.js.map +1 -1
- package/dist/search/clustering.d.ts +1 -1
- package/dist/search/clustering.d.ts.map +1 -1
- package/dist/search/clustering.js +7 -9
- package/dist/search/clustering.js.map +1 -1
- package/dist/search/embeddings.d.ts +1 -1
- package/dist/search/embeddings.d.ts.map +1 -1
- package/dist/search/embeddings.js +3 -3
- package/dist/search/embeddings.js.map +1 -1
- package/dist/search/semantic-search.d.ts +1 -1
- package/dist/search/semantic-search.d.ts.map +1 -1
- package/dist/search/semantic-search.js +5 -5
- package/dist/search/semantic-search.js.map +1 -1
- package/dist/translation/translator.d.ts +2 -2
- package/dist/translation/translator.d.ts.map +1 -1
- package/dist/translation/translator.js +8 -8
- package/dist/translation/translator.js.map +1 -1
- package/dist/writing/assistant.d.ts +3 -3
- package/dist/writing/assistant.d.ts.map +1 -1
- package/dist/writing/assistant.js +19 -16
- package/dist/writing/assistant.js.map +1 -1
- package/dist/writing/content-generator.d.ts +107 -0
- package/dist/writing/content-generator.d.ts.map +1 -0
- package/dist/writing/content-generator.js +273 -0
- package/dist/writing/content-generator.js.map +1 -0
- package/dist/writing/inline-suggestions.d.ts +2 -2
- package/dist/writing/inline-suggestions.d.ts.map +1 -1
- package/dist/writing/inline-suggestions.js +8 -5
- package/dist/writing/inline-suggestions.js.map +1 -1
- package/dist/writing/meta-generator.d.ts +2 -2
- package/dist/writing/meta-generator.d.ts.map +1 -1
- package/dist/writing/meta-generator.js +21 -9
- package/dist/writing/meta-generator.js.map +1 -1
- package/package.json +2 -2
|
@@ -4,49 +4,115 @@ export function calculateSEOScore(content) {
|
|
|
4
4
|
const titleLen = content.title.length;
|
|
5
5
|
const titleScore = titleLen >= 30 && titleLen <= 60 ? 15 : titleLen > 0 ? 8 : 0;
|
|
6
6
|
breakdown.push({
|
|
7
|
-
criterion:
|
|
7
|
+
criterion: 'Title length',
|
|
8
8
|
score: titleScore,
|
|
9
9
|
maxScore: 15,
|
|
10
|
-
suggestion: titleLen < 30
|
|
10
|
+
suggestion: titleLen < 30
|
|
11
|
+
? 'Title is too short — aim for 30-60 characters'
|
|
12
|
+
: titleLen > 60
|
|
13
|
+
? 'Title is too long — keep under 60 characters'
|
|
14
|
+
: undefined,
|
|
11
15
|
});
|
|
12
16
|
const metaLen = content.metaDescription.length;
|
|
13
17
|
const metaScore = metaLen >= 120 && metaLen <= 160 ? 10 : metaLen > 0 ? 5 : 0;
|
|
14
18
|
breakdown.push({
|
|
15
|
-
criterion:
|
|
19
|
+
criterion: 'Meta description length',
|
|
16
20
|
score: metaScore,
|
|
17
21
|
maxScore: 10,
|
|
18
|
-
suggestion: metaLen < 120
|
|
22
|
+
suggestion: metaLen < 120
|
|
23
|
+
? 'Meta description should be 120-160 characters'
|
|
24
|
+
: metaLen > 160
|
|
25
|
+
? 'Meta description is too long'
|
|
26
|
+
: undefined,
|
|
19
27
|
});
|
|
20
28
|
if (content.targetKeyword) {
|
|
21
29
|
const kw = content.targetKeyword.toLowerCase();
|
|
22
30
|
const titleHasKw = content.title.toLowerCase().includes(kw) ? 10 : 0;
|
|
23
|
-
breakdown.push({
|
|
24
|
-
|
|
31
|
+
breakdown.push({
|
|
32
|
+
criterion: 'Keyword in title',
|
|
33
|
+
score: titleHasKw,
|
|
34
|
+
maxScore: 10,
|
|
35
|
+
suggestion: titleHasKw === 0 ? 'Include target keyword in your title' : undefined,
|
|
36
|
+
});
|
|
37
|
+
const bodyKwCount = (content.body.toLowerCase().match(new RegExp(kw, 'g')) || []).length;
|
|
25
38
|
const bodyWordCount = content.body.split(/\s+/).length;
|
|
26
39
|
const density = bodyWordCount > 0 ? (bodyKwCount / bodyWordCount) * 100 : 0;
|
|
27
40
|
const densityScore = density >= 0.5 && density <= 2.5 ? 10 : bodyKwCount > 0 ? 5 : 0;
|
|
28
|
-
breakdown.push({
|
|
41
|
+
breakdown.push({
|
|
42
|
+
criterion: 'Keyword density',
|
|
43
|
+
score: densityScore,
|
|
44
|
+
maxScore: 10,
|
|
45
|
+
suggestion: density < 0.5
|
|
46
|
+
? 'Increase keyword usage in body'
|
|
47
|
+
: density > 2.5
|
|
48
|
+
? 'Reduce keyword stuffing'
|
|
49
|
+
: undefined,
|
|
50
|
+
});
|
|
29
51
|
const headingHasKw = (content.headings ?? []).some((h) => h.toLowerCase().includes(kw));
|
|
30
|
-
breakdown.push({
|
|
52
|
+
breakdown.push({
|
|
53
|
+
criterion: 'Keyword in headings',
|
|
54
|
+
score: headingHasKw ? 10 : 0,
|
|
55
|
+
maxScore: 10,
|
|
56
|
+
suggestion: headingHasKw ? undefined : 'Add target keyword to at least one heading',
|
|
57
|
+
});
|
|
31
58
|
}
|
|
32
59
|
else {
|
|
33
|
-
breakdown.push({
|
|
34
|
-
|
|
35
|
-
|
|
60
|
+
breakdown.push({
|
|
61
|
+
criterion: 'Keyword in title',
|
|
62
|
+
score: 0,
|
|
63
|
+
maxScore: 10,
|
|
64
|
+
suggestion: 'Set a target keyword',
|
|
65
|
+
});
|
|
66
|
+
breakdown.push({
|
|
67
|
+
criterion: 'Keyword density',
|
|
68
|
+
score: 0,
|
|
69
|
+
maxScore: 10,
|
|
70
|
+
suggestion: 'Set a target keyword',
|
|
71
|
+
});
|
|
72
|
+
breakdown.push({
|
|
73
|
+
criterion: 'Keyword in headings',
|
|
74
|
+
score: 0,
|
|
75
|
+
maxScore: 10,
|
|
76
|
+
suggestion: 'Set a target keyword',
|
|
77
|
+
});
|
|
36
78
|
}
|
|
37
79
|
const headings = content.headings ?? [];
|
|
38
80
|
const headingScore = headings.length >= 2 ? 10 : headings.length === 1 ? 5 : 0;
|
|
39
|
-
breakdown.push({
|
|
81
|
+
breakdown.push({
|
|
82
|
+
criterion: 'Heading structure',
|
|
83
|
+
score: headingScore,
|
|
84
|
+
maxScore: 10,
|
|
85
|
+
suggestion: headings.length < 2 ? 'Use at least two headings to structure content' : undefined,
|
|
86
|
+
});
|
|
40
87
|
const images = content.images ?? [];
|
|
41
88
|
const imagesWithAlt = images.filter((img) => img.alt && img.alt.trim().length > 0).length;
|
|
42
|
-
const altScore = images.length === 0
|
|
43
|
-
|
|
89
|
+
const altScore = images.length === 0
|
|
90
|
+
? 5
|
|
91
|
+
: images.length === imagesWithAlt
|
|
92
|
+
? 10
|
|
93
|
+
: Math.round((imagesWithAlt / images.length) * 10);
|
|
94
|
+
breakdown.push({
|
|
95
|
+
criterion: 'Image alt texts',
|
|
96
|
+
score: altScore,
|
|
97
|
+
maxScore: 10,
|
|
98
|
+
suggestion: imagesWithAlt < images.length ? 'Add alt text to all images' : undefined,
|
|
99
|
+
});
|
|
44
100
|
const linkCount = (content.internalLinks?.length ?? 0) + (content.externalLinks?.length ?? 0);
|
|
45
101
|
const linkScore = linkCount >= 3 ? 10 : linkCount >= 1 ? 5 : 0;
|
|
46
|
-
breakdown.push({
|
|
102
|
+
breakdown.push({
|
|
103
|
+
criterion: 'Link count',
|
|
104
|
+
score: linkScore,
|
|
105
|
+
maxScore: 10,
|
|
106
|
+
suggestion: linkCount < 3 ? 'Add more internal and external links' : undefined,
|
|
107
|
+
});
|
|
47
108
|
const wordCount = content.body.split(/\s+/).filter(Boolean).length;
|
|
48
109
|
const lengthScore = wordCount >= 300 ? 15 : wordCount >= 150 ? 8 : wordCount > 0 ? 3 : 0;
|
|
49
|
-
breakdown.push({
|
|
110
|
+
breakdown.push({
|
|
111
|
+
criterion: 'Content length',
|
|
112
|
+
score: lengthScore,
|
|
113
|
+
maxScore: 15,
|
|
114
|
+
suggestion: wordCount < 300 ? 'Aim for at least 300 words' : undefined,
|
|
115
|
+
});
|
|
50
116
|
const totalScore = breakdown.reduce((sum, b) => sum + b.score, 0);
|
|
51
117
|
return { score: totalScore, breakdown };
|
|
52
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seo-score.js","sourceRoot":"","sources":["../../src/scoring/seo-score.ts"],"names":[],"mappings":"AAsBA,+FAA+F;AAC/F,MAAM,UAAU,iBAAiB,CAAC,OAAmB;IACnD,MAAM,SAAS,GAAgC,EAAE,
|
|
1
|
+
{"version":3,"file":"seo-score.js","sourceRoot":"","sources":["../../src/scoring/seo-score.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clustering.d.ts","sourceRoot":"","sources":["../../src/search/clustering.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"clustering.d.ts","sourceRoot":"","sources":["../../src/search/clustering.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,mFAAmF;AACnF,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,EAAE,CAAC,CAwB3B"}
|
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
/** Clusters content items by semantic similarity using the specified algorithm. */
|
|
2
2
|
export async function clusterContent(items, options) {
|
|
3
|
-
const algorithm = options?.algorithm ??
|
|
3
|
+
const algorithm = options?.algorithm ?? 'kmeans';
|
|
4
4
|
const numClusters = options?.numClusters ?? Math.max(2, Math.floor(Math.sqrt(items.length)));
|
|
5
5
|
const minClusterSize = options?.minClusterSize ?? 2;
|
|
6
6
|
const embeddedItems = items.filter((item) => item.embedding && item.embedding.length > 0);
|
|
7
7
|
if (embeddedItems.length < minClusterSize) {
|
|
8
8
|
return [
|
|
9
9
|
{
|
|
10
|
-
id:
|
|
11
|
-
label:
|
|
10
|
+
id: 'cluster-0',
|
|
11
|
+
label: 'All Content',
|
|
12
12
|
items,
|
|
13
13
|
centroid: [],
|
|
14
14
|
coherence: 1.0,
|
|
15
15
|
},
|
|
16
16
|
];
|
|
17
17
|
}
|
|
18
|
-
if (algorithm ===
|
|
18
|
+
if (algorithm === 'kmeans') {
|
|
19
19
|
return kMeansClustering(embeddedItems, numClusters);
|
|
20
20
|
}
|
|
21
21
|
return dbscanClustering(embeddedItems, minClusterSize);
|
|
22
22
|
}
|
|
23
23
|
function kMeansClustering(items, k) {
|
|
24
24
|
const dimensions = items[0].embedding.length;
|
|
25
|
-
const centroids = items
|
|
26
|
-
.slice(0, k)
|
|
27
|
-
.map((item) => [...item.embedding]);
|
|
25
|
+
const centroids = items.slice(0, k).map((item) => [...item.embedding]);
|
|
28
26
|
const assignments = new Array(items.length).fill(0);
|
|
29
27
|
for (let iteration = 0; iteration < 20; iteration++) {
|
|
30
28
|
for (let i = 0; i < items.length; i++) {
|
|
@@ -65,8 +63,8 @@ function dbscanClustering(items, minSize) {
|
|
|
65
63
|
void minSize;
|
|
66
64
|
return [
|
|
67
65
|
{
|
|
68
|
-
id:
|
|
69
|
-
label:
|
|
66
|
+
id: 'cluster-0',
|
|
67
|
+
label: 'DBSCAN Cluster',
|
|
70
68
|
items,
|
|
71
69
|
centroid: items[0].embedding ?? [],
|
|
72
70
|
coherence: 0.5,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clustering.js","sourceRoot":"","sources":["../../src/search/clustering.ts"],"names":[],"mappings":"AAoBA,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAqB,EACrB,OAAwB;IAExB,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,QAAQ,
|
|
1
|
+
{"version":3,"file":"clustering.js","sourceRoot":"","sources":["../../src/search/clustering.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/search/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/search/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,uDAAuD;AACvD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,eAAe,CAAC,CAc1B;AAED,wDAAwD;AACxD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CAM5B;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAoBjE"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
/** Generates a vector embedding for the given text. */
|
|
2
2
|
export async function generateEmbedding(text, provider) {
|
|
3
3
|
if (!provider) {
|
|
4
|
-
throw new Error(
|
|
4
|
+
throw new Error('Embedding generation requires an AI provider');
|
|
5
5
|
}
|
|
6
6
|
const vector = await provider.generateEmbedding(text);
|
|
7
7
|
const tokenCount = Math.ceil(text.split(/\s+/).length * 1.3);
|
|
8
8
|
return {
|
|
9
9
|
vector,
|
|
10
10
|
dimensions: vector.length,
|
|
11
|
-
model:
|
|
11
|
+
model: 'provider-default',
|
|
12
12
|
tokenCount,
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
/** Generates embeddings for multiple texts in batch. */
|
|
16
16
|
export async function generateBatchEmbeddings(texts, provider) {
|
|
17
17
|
if (!provider) {
|
|
18
|
-
throw new Error(
|
|
18
|
+
throw new Error('Embedding generation requires an AI provider');
|
|
19
19
|
}
|
|
20
20
|
return Promise.all(texts.map((text) => generateEmbedding(text, provider)));
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/search/embeddings.ts"],"names":[],"mappings":"AASA,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,QAAqB;IAErB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/search/embeddings.ts"],"names":[],"mappings":"AASA,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,QAAqB;IAErB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAA;IAE5D,OAAO;QACL,MAAM;QACN,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,KAAK,EAAE,kBAAkB;QACzB,UAAU;KACX,CAAA;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAe,EACf,QAAqB;IAErB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC5E,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IAC1E,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAE5B,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QAC3B,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QAC3B,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IAC7B,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC/D,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAE7B,OAAO,UAAU,GAAG,SAAS,CAAA;AAC/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-search.d.ts","sourceRoot":"","sources":["../../src/search/semantic-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"semantic-search.d.ts","sourceRoot":"","sources":["../../src/search/semantic-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAKvD,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAA;QACV,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KACrB,CAAC,CAAA;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA6DjC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { requireAIProvider } from
|
|
2
|
-
import { generateEmbedding } from
|
|
3
|
-
import { cosineSimilarity } from
|
|
1
|
+
import { requireAIProvider } from '../providers/index.js';
|
|
2
|
+
import { generateEmbedding } from './embeddings.js';
|
|
3
|
+
import { cosineSimilarity } from './embeddings.js';
|
|
4
4
|
/**
|
|
5
5
|
* Performs semantic search across content using vector similarity.
|
|
6
6
|
*
|
|
@@ -53,7 +53,7 @@ export async function semanticSearch(query, options) {
|
|
|
53
53
|
// For production use with a vector database (pgvector, Pinecone, etc.),
|
|
54
54
|
// the embedding would be passed to the vector store's similarity search API.
|
|
55
55
|
// This requires project-specific setup based on the chosen vector store.
|
|
56
|
-
throw new Error(
|
|
57
|
-
|
|
56
|
+
throw new Error('Semantic search requires either a pre-computed corpus (pass options.corpus) ' +
|
|
57
|
+
'or a vector database integration. See docs for pgvector setup.');
|
|
58
58
|
}
|
|
59
59
|
//# sourceMappingURL=semantic-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/search/semantic-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/search/semantic-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { BrandVoiceProfile } from
|
|
2
|
-
import type { AIProvider } from
|
|
1
|
+
import type { BrandVoiceProfile } from '../brand/voice-profile.js';
|
|
2
|
+
import type { AIProvider } from '../providers/index.js';
|
|
3
3
|
export interface TranslationOptions {
|
|
4
4
|
sourceLanguage: string;
|
|
5
5
|
targetLanguage: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../../src/translation/translator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../../src/translation/translator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,UAAU,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACjE;AAED,4FAA4F;AAC5F,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAkD5B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { requireAIProvider } from
|
|
1
|
+
import { requireAIProvider } from '../providers/index.js';
|
|
2
2
|
/** Translates content between languages while preserving brand voice and glossary terms. */
|
|
3
3
|
export async function translateContent(content, options) {
|
|
4
4
|
const ai = options.provider ?? requireAIProvider();
|
|
@@ -11,20 +11,20 @@ export async function translateContent(content, options) {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
const glossaryInstruction = glossaryMatches.length > 0
|
|
14
|
-
? `\n\nGlossary (use these exact translations):\n${glossaryMatches.map((g) => `- "${g.original}" → "${g.translated}"`).join(
|
|
15
|
-
:
|
|
14
|
+
? `\n\nGlossary (use these exact translations):\n${glossaryMatches.map((g) => `- "${g.original}" → "${g.translated}"`).join('\n')}`
|
|
15
|
+
: '';
|
|
16
16
|
const brandInstruction = options.brandProfile
|
|
17
|
-
? `\nMaintain a ${options.brandProfile.tone.map((t) => t.dimension).join(
|
|
18
|
-
:
|
|
17
|
+
? `\nMaintain a ${options.brandProfile.tone.map((t) => t.dimension).join('/')} tone.`
|
|
18
|
+
: '';
|
|
19
19
|
const formatInstruction = options.preserveFormatting !== false
|
|
20
|
-
?
|
|
21
|
-
:
|
|
20
|
+
? '\nPreserve all HTML tags, markdown formatting, and line breaks exactly.'
|
|
21
|
+
: '';
|
|
22
22
|
const prompt = `Translate the following content from ${options.sourceLanguage} to ${options.targetLanguage}.${formatInstruction}${brandInstruction}${glossaryInstruction}
|
|
23
23
|
|
|
24
24
|
Content to translate:
|
|
25
25
|
${content}`;
|
|
26
26
|
const result = await ai.generateText(prompt, {
|
|
27
|
-
systemPrompt:
|
|
27
|
+
systemPrompt: 'You are a professional translator. Translate accurately while preserving meaning, tone, and formatting. Return only the translated text, no explanations.',
|
|
28
28
|
maxTokens: Math.max(2048, Math.ceil(content.length * 1.5)),
|
|
29
29
|
temperature: 0.3,
|
|
30
30
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translator.js","sourceRoot":"","sources":["../../src/translation/translator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"translator.js","sourceRoot":"","sources":["../../src/translation/translator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAoBzD,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,OAA2B;IAE3B,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,EAAE,CAAA;IAElD,MAAM,eAAe,GAAyC,EAAE,CAAA;IAEhE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC3D,eAAe,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GACvB,eAAe,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC,iDAAiD,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnI,CAAC,CAAC,EAAE,CAAA;IAER,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY;QAC3C,CAAC,CAAC,gBAAgB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ;QACrF,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,iBAAiB,GACrB,OAAO,CAAC,kBAAkB,KAAK,KAAK;QAClC,CAAC,CAAC,yEAAyE;QAC3E,CAAC,CAAC,EAAE,CAAA;IAER,MAAM,MAAM,GAAG,wCAAwC,OAAO,CAAC,cAAc,OAAO,OAAO,CAAC,cAAc,IAAI,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB;;;EAGxK,OAAO,EAAE,CAAA;IAET,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE;QAC3C,YAAY,EACV,2JAA2J;QAC7J,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC1D,WAAW,EAAE,GAAG;KACjB,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACrC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;IAEhE,OAAO;QACL,UAAU;QACV,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,SAAS;QACT,UAAU,EAAE,IAAI;QAChB,eAAe;KAChB,CAAA;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { BrandVoiceProfile } from
|
|
2
|
-
import type { AIProvider } from
|
|
1
|
+
import type { BrandVoiceProfile } from '../brand/voice-profile.js';
|
|
2
|
+
import type { AIProvider } from '../providers/index.js';
|
|
3
3
|
export interface WritingContext {
|
|
4
4
|
collectionSlug?: string;
|
|
5
5
|
existingContent?: string;
|
|
@@ -12,7 +12,7 @@ export interface ProofreadResult {
|
|
|
12
12
|
changes: Array<{
|
|
13
13
|
original: string;
|
|
14
14
|
corrected: string;
|
|
15
|
-
type:
|
|
15
|
+
type: 'grammar' | 'spelling' | 'style' | 'clarity';
|
|
16
16
|
}>;
|
|
17
17
|
}
|
|
18
18
|
/** Generates content from a prompt with optional context. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/writing/assistant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/writing/assistant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,UAAU,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAA;KACnD,CAAC,CAAA;CACH;AAkCD,6DAA6D;AAC7D,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBxF;AAED,iEAAiE;AACjE,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,+EAA+E;AAC/E,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,4DAA4D;AAC5D,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,2EAA2E;AAC3E,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CA+B7F"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { requireAIProvider } from
|
|
1
|
+
import { requireAIProvider } from '../providers/index.js';
|
|
2
2
|
function resolveProvider(context) {
|
|
3
3
|
return context?.provider ?? requireAIProvider();
|
|
4
4
|
}
|
|
5
5
|
function buildSystemPrompt(context) {
|
|
6
6
|
const parts = [
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
'You are an expert content writer for a CMS.',
|
|
8
|
+
'Do not include passwords, API keys, personal data, or other sensitive information in your output.',
|
|
9
9
|
];
|
|
10
10
|
if (context?.collectionSlug) {
|
|
11
11
|
parts.push(`Content type: ${context.collectionSlug}.`);
|
|
@@ -16,16 +16,16 @@ function buildSystemPrompt(context) {
|
|
|
16
16
|
if (context?.brandProfile) {
|
|
17
17
|
const tone = context.brandProfile.tone
|
|
18
18
|
.map((t) => `${t.dimension}: ${Math.round(t.value * 100)}%`)
|
|
19
|
-
.join(
|
|
19
|
+
.join(', ');
|
|
20
20
|
parts.push(`Brand tone: ${tone}.`);
|
|
21
21
|
if (context.brandProfile.vocabulary.preferred.length > 0) {
|
|
22
|
-
parts.push(`Preferred terms: ${context.brandProfile.vocabulary.preferred.join(
|
|
22
|
+
parts.push(`Preferred terms: ${context.brandProfile.vocabulary.preferred.join(', ')}.`);
|
|
23
23
|
}
|
|
24
24
|
if (context.brandProfile.vocabulary.avoided.length > 0) {
|
|
25
|
-
parts.push(`Avoid these terms: ${context.brandProfile.vocabulary.avoided.join(
|
|
25
|
+
parts.push(`Avoid these terms: ${context.brandProfile.vocabulary.avoided.join(', ')}.`);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
return parts.join(
|
|
28
|
+
return parts.join(' ');
|
|
29
29
|
}
|
|
30
30
|
/** Generates content from a prompt with optional context. */
|
|
31
31
|
export async function generate(prompt, context) {
|
|
@@ -45,9 +45,9 @@ export async function generate(prompt, context) {
|
|
|
45
45
|
/** Expands the given text with additional detail and context. */
|
|
46
46
|
export async function expand(text, instructions, provider) {
|
|
47
47
|
const ai = provider ?? requireAIProvider();
|
|
48
|
-
const prompt = `Expand the following text with additional detail and context${instructions ? `. Instructions: ${instructions}` :
|
|
48
|
+
const prompt = `Expand the following text with additional detail and context${instructions ? `. Instructions: ${instructions}` : ''}. Maintain the same voice and style.\n\n${text}`;
|
|
49
49
|
const result = await ai.generateText(prompt, {
|
|
50
|
-
systemPrompt:
|
|
50
|
+
systemPrompt: 'You are a content writer. Expand the text while maintaining its voice, style, and accuracy.',
|
|
51
51
|
maxTokens: 2048,
|
|
52
52
|
temperature: 0.7,
|
|
53
53
|
});
|
|
@@ -58,10 +58,10 @@ export async function compress(text, targetLength, provider) {
|
|
|
58
58
|
const ai = provider ?? requireAIProvider();
|
|
59
59
|
const lengthInstruction = targetLength
|
|
60
60
|
? `Target approximately ${targetLength} characters.`
|
|
61
|
-
:
|
|
61
|
+
: 'Make it significantly shorter.';
|
|
62
62
|
const prompt = `Compress the following text while preserving all key information. ${lengthInstruction}\n\n${text}`;
|
|
63
63
|
const result = await ai.generateText(prompt, {
|
|
64
|
-
systemPrompt:
|
|
64
|
+
systemPrompt: 'You are an editor. Compress text while preserving meaning, key points, and readability.',
|
|
65
65
|
maxTokens: 1024,
|
|
66
66
|
temperature: 0.3,
|
|
67
67
|
});
|
|
@@ -70,10 +70,10 @@ export async function compress(text, targetLength, provider) {
|
|
|
70
70
|
/** Rewrites the given text in a different style or tone. */
|
|
71
71
|
export async function rewrite(text, style, tone, provider) {
|
|
72
72
|
const ai = provider ?? requireAIProvider();
|
|
73
|
-
const modifiers = [style && `style: ${style}`, tone && `tone: ${tone}`].filter(Boolean).join(
|
|
74
|
-
const prompt = `Rewrite the following text${modifiers ? ` with ${modifiers}` :
|
|
73
|
+
const modifiers = [style && `style: ${style}`, tone && `tone: ${tone}`].filter(Boolean).join(', ');
|
|
74
|
+
const prompt = `Rewrite the following text${modifiers ? ` with ${modifiers}` : ' to improve clarity and engagement'}:\n\n${text}`;
|
|
75
75
|
const result = await ai.generateText(prompt, {
|
|
76
|
-
systemPrompt:
|
|
76
|
+
systemPrompt: 'You are a content editor. Rewrite text as requested while preserving the core message.',
|
|
77
77
|
maxTokens: 2048,
|
|
78
78
|
temperature: 0.7,
|
|
79
79
|
});
|
|
@@ -91,12 +91,15 @@ Only include actual errors. If the text is correct, return an empty changes arra
|
|
|
91
91
|
Text to proofread:
|
|
92
92
|
${text}`;
|
|
93
93
|
const result = await ai.generateText(prompt, {
|
|
94
|
-
systemPrompt:
|
|
94
|
+
systemPrompt: 'You are a professional proofreader. Return valid JSON only, no markdown formatting.',
|
|
95
95
|
maxTokens: 2048,
|
|
96
96
|
temperature: 0.2,
|
|
97
97
|
});
|
|
98
98
|
try {
|
|
99
|
-
const cleaned = result.text
|
|
99
|
+
const cleaned = result.text
|
|
100
|
+
.replace(/```json?\n?/g, '')
|
|
101
|
+
.replace(/```/g, '')
|
|
102
|
+
.trim();
|
|
100
103
|
const parsed = JSON.parse(cleaned);
|
|
101
104
|
return {
|
|
102
105
|
corrected: parsed.corrected ?? text,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant.js","sourceRoot":"","sources":["../../src/writing/assistant.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"assistant.js","sourceRoot":"","sources":["../../src/writing/assistant.ts"],"names":[],"mappings":"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"}
|