@llm-newsletter-kit/core 1.3.8 → 1.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  var runnables = require('@langchain/core/runnables');
4
4
  var esToolkit = require('es-toolkit');
5
- var ai = require('ai');
6
5
  var zod = require('zod');
6
+ var ai = require('ai');
7
7
  var jsdom = require('jsdom');
8
8
  var juice = require('juice');
9
9
  var safeMarkdown2Html = require('safe-markdown2html');
@@ -91,6 +91,25 @@ class LoggingExecutor {
91
91
  }
92
92
  }
93
93
 
94
+ async function generateObjectByLLM({ schema, ...rest }) {
95
+ const result = await ai.generateText({
96
+ ...rest,
97
+ output: ai.Output.object({ schema }),
98
+ // Anthropic truncates structured output when it contains quotation marks.
99
+ // Using 'jsonTool' mode avoids this issue.
100
+ providerOptions: {
101
+ anthropic: {
102
+ structuredOutputMode: 'jsonTool',
103
+ },
104
+ },
105
+ });
106
+ return {
107
+ output: result.output,
108
+ usage: result.usage,
109
+ finishReason: result.finishReason,
110
+ };
111
+ }
112
+
94
113
  /**
95
114
  * Replaces ASCII double quotes with Unicode smart quotes (U+201C, U+201D).
96
115
  * Prevents JSON structured output corruption when LLM reproduces quoted titles.
@@ -186,12 +205,10 @@ class AnalyzeImages extends LLMQuery {
186
205
  if (this.imageMessages.length === 0) {
187
206
  return { result: null, usage: ZERO_USAGE };
188
207
  }
189
- const { output, usage } = await ai.generateText({
208
+ const { output, usage } = await generateObjectByLLM({
190
209
  model: this.model,
191
210
  maxRetries: this.options.llm.maxRetries,
192
- output: ai.Output.object({
193
- schema: this.schema,
194
- }),
211
+ schema: this.schema,
195
212
  system: this.systemPrompt,
196
213
  messages: [
197
214
  {
@@ -316,12 +333,10 @@ class ClassifyTags extends LLMQuery {
316
333
  }
317
334
  async execute({ existTags }) {
318
335
  this.existTags = existTags;
319
- const { output, usage } = await ai.generateText({
336
+ const { output, usage } = await generateObjectByLLM({
320
337
  model: this.model,
321
338
  maxRetries: this.options.llm.maxRetries,
322
- output: ai.Output.object({
323
- schema: this.schema,
324
- }),
339
+ schema: this.schema,
325
340
  system: this.systemPrompt,
326
341
  prompt: this.userPrompt,
327
342
  });
@@ -398,12 +413,10 @@ class DetermineArticleImportance extends LLMQuery {
398
413
  this.dateService = config.dateService;
399
414
  }
400
415
  async execute() {
401
- const { output, usage } = await ai.generateText({
416
+ const { output, usage } = await generateObjectByLLM({
402
417
  model: this.model,
403
418
  maxRetries: this.options.llm.maxRetries,
404
- output: ai.Output.object({
405
- schema: this.schema,
406
- }),
419
+ schema: this.schema,
407
420
  system: this.systemPrompt,
408
421
  prompt: this.userPrompt,
409
422
  });
@@ -910,11 +923,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
910
923
  subscribePageUrl;
911
924
  newsletterBrandName;
912
925
  schema = zod.z.object({
913
- title: zod.z
914
- .string()
915
- .max(100)
916
- .min(20)
917
- .describe('Title of the newsletter email'),
926
+ title: zod.z.string().max(70).min(20).describe('Title of the newsletter email'),
918
927
  content: zod.z.string().describe('Email content in markdown format'),
919
928
  isWrittenInOutputLanguage: zod.z
920
929
  .boolean()
@@ -940,7 +949,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
940
949
  this.newsletterBrandName = config.newsletterBrandName;
941
950
  }
942
951
  async execute() {
943
- const { output, usage, finishReason } = await ai.generateText({
952
+ const { output, usage, finishReason } = await generateObjectByLLM({
944
953
  model: this.model,
945
954
  maxRetries: this.options.llm.maxRetries,
946
955
  maxOutputTokens: this.maxOutputTokens,
@@ -949,9 +958,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
949
958
  topK: this.topK,
950
959
  presencePenalty: this.presencePenalty,
951
960
  frequencyPenalty: this.frequencyPenalty,
952
- output: ai.Output.object({
953
- schema: this.schema,
954
- }),
961
+ schema: this.schema,
955
962
  system: this.systemPrompt,
956
963
  prompt: this.userPrompt,
957
964
  });
@@ -1076,7 +1083,7 @@ Output Format & Requirements:
1076
1083
 
1077
1084
  7. Title Writing Guidelines:${this.options.content.titleContext
1078
1085
  ? `\n - **Required title keyword**: "${this.options.content.titleContext}". This phrase MUST appear in the title. Combine it with key context from today's newsletter content to form a natural, complete title.
1079
- - Keep title length 20-100 characters and can include 1-2 relevant emoticons.
1086
+ - Keep title length 20-70 characters.
1080
1087
  - Use neutral and objective terms in title (e.g., 'announced', 'implementing', 'deadline approaching').
1081
1088
  - Write title clearly and factually to maintain professionalism and credibility.`
1082
1089
  : `
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { RunnablePassthrough, RunnableSequence } from '@langchain/core/runnables';
2
2
  import { pick, omit } from 'es-toolkit';
3
- import { generateText, Output } from 'ai';
4
3
  import { z } from 'zod';
4
+ import { generateText, Output } from 'ai';
5
5
  import { JSDOM } from 'jsdom';
6
6
  import juice from 'juice';
7
7
  import safeMarkdown2Html from 'safe-markdown2html';
@@ -89,6 +89,25 @@ class LoggingExecutor {
89
89
  }
90
90
  }
91
91
 
92
+ async function generateObjectByLLM({ schema, ...rest }) {
93
+ const result = await generateText({
94
+ ...rest,
95
+ output: Output.object({ schema }),
96
+ // Anthropic truncates structured output when it contains quotation marks.
97
+ // Using 'jsonTool' mode avoids this issue.
98
+ providerOptions: {
99
+ anthropic: {
100
+ structuredOutputMode: 'jsonTool',
101
+ },
102
+ },
103
+ });
104
+ return {
105
+ output: result.output,
106
+ usage: result.usage,
107
+ finishReason: result.finishReason,
108
+ };
109
+ }
110
+
92
111
  /**
93
112
  * Replaces ASCII double quotes with Unicode smart quotes (U+201C, U+201D).
94
113
  * Prevents JSON structured output corruption when LLM reproduces quoted titles.
@@ -184,12 +203,10 @@ class AnalyzeImages extends LLMQuery {
184
203
  if (this.imageMessages.length === 0) {
185
204
  return { result: null, usage: ZERO_USAGE };
186
205
  }
187
- const { output, usage } = await generateText({
206
+ const { output, usage } = await generateObjectByLLM({
188
207
  model: this.model,
189
208
  maxRetries: this.options.llm.maxRetries,
190
- output: Output.object({
191
- schema: this.schema,
192
- }),
209
+ schema: this.schema,
193
210
  system: this.systemPrompt,
194
211
  messages: [
195
212
  {
@@ -314,12 +331,10 @@ class ClassifyTags extends LLMQuery {
314
331
  }
315
332
  async execute({ existTags }) {
316
333
  this.existTags = existTags;
317
- const { output, usage } = await generateText({
334
+ const { output, usage } = await generateObjectByLLM({
318
335
  model: this.model,
319
336
  maxRetries: this.options.llm.maxRetries,
320
- output: Output.object({
321
- schema: this.schema,
322
- }),
337
+ schema: this.schema,
323
338
  system: this.systemPrompt,
324
339
  prompt: this.userPrompt,
325
340
  });
@@ -396,12 +411,10 @@ class DetermineArticleImportance extends LLMQuery {
396
411
  this.dateService = config.dateService;
397
412
  }
398
413
  async execute() {
399
- const { output, usage } = await generateText({
414
+ const { output, usage } = await generateObjectByLLM({
400
415
  model: this.model,
401
416
  maxRetries: this.options.llm.maxRetries,
402
- output: Output.object({
403
- schema: this.schema,
404
- }),
417
+ schema: this.schema,
405
418
  system: this.systemPrompt,
406
419
  prompt: this.userPrompt,
407
420
  });
@@ -908,11 +921,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
908
921
  subscribePageUrl;
909
922
  newsletterBrandName;
910
923
  schema = z.object({
911
- title: z
912
- .string()
913
- .max(100)
914
- .min(20)
915
- .describe('Title of the newsletter email'),
924
+ title: z.string().max(70).min(20).describe('Title of the newsletter email'),
916
925
  content: z.string().describe('Email content in markdown format'),
917
926
  isWrittenInOutputLanguage: z
918
927
  .boolean()
@@ -938,7 +947,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
938
947
  this.newsletterBrandName = config.newsletterBrandName;
939
948
  }
940
949
  async execute() {
941
- const { output, usage, finishReason } = await generateText({
950
+ const { output, usage, finishReason } = await generateObjectByLLM({
942
951
  model: this.model,
943
952
  maxRetries: this.options.llm.maxRetries,
944
953
  maxOutputTokens: this.maxOutputTokens,
@@ -947,9 +956,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
947
956
  topK: this.topK,
948
957
  presencePenalty: this.presencePenalty,
949
958
  frequencyPenalty: this.frequencyPenalty,
950
- output: Output.object({
951
- schema: this.schema,
952
- }),
959
+ schema: this.schema,
953
960
  system: this.systemPrompt,
954
961
  prompt: this.userPrompt,
955
962
  });
@@ -1074,7 +1081,7 @@ Output Format & Requirements:
1074
1081
 
1075
1082
  7. Title Writing Guidelines:${this.options.content.titleContext
1076
1083
  ? `\n - **Required title keyword**: "${this.options.content.titleContext}". This phrase MUST appear in the title. Combine it with key context from today's newsletter content to form a natural, complete title.
1077
- - Keep title length 20-100 characters and can include 1-2 relevant emoticons.
1084
+ - Keep title length 20-70 characters.
1078
1085
  - Use neutral and objective terms in title (e.g., 'announced', 'implementing', 'deadline approaching').
1079
1086
  - Write title clearly and factually to maintain professionalism and credibility.`
1080
1087
  : `
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@llm-newsletter-kit/core",
3
3
  "private": false,
4
4
  "type": "module",
5
- "version": "1.3.8",
5
+ "version": "1.3.10",
6
6
  "description": "An extensible framework to automate your entire newsletter workflow. Handles data collection, LLM-based content analysis, and email generation, letting you focus on your unique domain logic.",
7
7
  "main": "dist/index.cjs",
8
8
  "module": "dist/index.js",
@@ -48,36 +48,36 @@
48
48
  "author": "kimhongyeon",
49
49
  "license": "Apache-2.0",
50
50
  "dependencies": {
51
- "@langchain/core": "^1.1.35",
52
- "ai": "^6.0.134",
51
+ "@langchain/core": "^1.1.39",
52
+ "ai": "^6.0.154",
53
53
  "es-toolkit": "^1.45.1",
54
- "jsdom": "^29.0.1",
54
+ "jsdom": "^29.0.2",
55
55
  "juice": "^11.1.1",
56
56
  "safe-markdown2html": "^1.0.1",
57
57
  "zod": "^4.3.6"
58
58
  },
59
59
  "devDependencies": {
60
- "@ai-sdk/anthropic": "^3.0.63",
61
- "@ai-sdk/google": "^3.0.52",
62
- "@ai-sdk/openai": "^3.0.47",
63
- "@ai-sdk/togetherai": "^2.0.41",
60
+ "@ai-sdk/anthropic": "^3.0.68",
61
+ "@ai-sdk/google": "^3.0.60",
62
+ "@ai-sdk/openai": "^3.0.52",
63
+ "@ai-sdk/togetherai": "^2.0.45",
64
64
  "@eslint/js": "^10.0.1",
65
65
  "@trivago/prettier-plugin-sort-imports": "^6.0.2",
66
66
  "@types/jsdom": "^28.0.1",
67
- "@types/node": "^25.5.0",
68
- "@vitest/coverage-v8": "^4.1.0",
69
- "@vitest/expect": "^4.1.0",
70
- "eslint": "^10.1.0",
67
+ "@types/node": "^25.5.2",
68
+ "@vitest/coverage-v8": "^4.1.4",
69
+ "@vitest/expect": "^4.1.4",
70
+ "eslint": "^10.2.0",
71
71
  "eslint-plugin-unused-imports": "^4.4.1",
72
72
  "prettier": "^3.8.1",
73
73
  "rimraf": "^6.1.3",
74
- "rollup": "^4.60.0",
74
+ "rollup": "^4.60.1",
75
75
  "rollup-plugin-dts": "^6.4.1",
76
- "rollup-plugin-typescript2": "^0.36.0",
76
+ "rollup-plugin-typescript2": "^0.37.0",
77
77
  "tsx": "^4.21.0",
78
- "typescript": "^5.9.3",
79
- "typescript-eslint": "^8.57.1",
80
- "vitest": "^4.1.0"
78
+ "typescript": "^6.0.2",
79
+ "typescript-eslint": "^8.58.1",
80
+ "vitest": "^4.1.4"
81
81
  },
82
82
  "repository": {
83
83
  "type": "git",