@heripo/research-radar 5.2.0 → 5.2.2
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/README.md +4 -4
- package/dist/index.js +46 -10
- package/dist/index.js.map +1 -1
- package/package.json +17 -17
package/README.md
CHANGED
|
@@ -67,10 +67,10 @@ For academic publications:
|
|
|
67
67
|
## Installation
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
|
-
npm install @heripo/research-radar '@llm-newsletter-kit/core@~3.0.
|
|
70
|
+
npm install @heripo/research-radar '@llm-newsletter-kit/core@~3.0.6'
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
**Requirements**: Node.js
|
|
73
|
+
**Requirements**: Node.js 24.15.0 or newer within 24.x, or >= 26.0.0, and an ESM application. Node.js 25 is not supported. The package exports `dist/index.js` and TypeScript declarations (`dist/index.d.ts`), with a JavaScript sourcemap. The core engine is a peer dependency; the current supported range is `~3.0.6`. The floor moved to 3.0.6 because the 나라장터 target runs its triage inside a crawl fetch that core times out, and before 3.0.6 core classified a timeout as non-retryable, so that target failed on the first attempt every run. 3.0.5 remains required for the self-verification retry cap the generation prompt relies on.
|
|
74
74
|
|
|
75
75
|
Article analysis requires an OpenAI API key. Content generation requires a key for the selected provider (OpenAI / Anthropic / Google); OpenAI can use the same key for both. Keys are passed explicitly to the library; load environment variables in your application.
|
|
76
76
|
|
|
@@ -176,7 +176,7 @@ Defaults below describe the checked-in code, not provider recommendations. This
|
|
|
176
176
|
|
|
177
177
|
Select content generation with `contentGeneration: { provider, apiKey, model? }`. `model` overrides that provider's default. Analysis models are configured in [analysis.provider.ts](./src/providers/analysis.provider.ts).
|
|
178
178
|
|
|
179
|
-
[src/config/index.ts](./src/config/index.ts) defines Korean output (`outputLanguage: '한국어'`), the cultural heritage domain (`expertField: ['문화유산']`), brand name, `subscribePageUrl`, LLM `maxRetries: 5`, chain `stopAfterAttempt: 3`, and generation `temperature: 0.3`. Publication settings are `minimumArticleCountForIssue: 5` and `priorityArticleScoreThreshold: 8`; the core engine evaluates them. In the locked core 3.0.
|
|
179
|
+
[src/config/index.ts](./src/config/index.ts) defines Korean output (`outputLanguage: '한국어'`), the cultural heritage domain (`expertField: ['문화유산']`), brand name, `subscribePageUrl`, LLM `maxRetries: 5`, chain `stopAfterAttempt: 3`, and generation `temperature: 0.3`. Publication settings are `minimumArticleCountForIssue: 5` and `priorityArticleScoreThreshold: 8`; the core engine evaluates them. In the locked core 3.0.6 implementation, the count check skips **5 or fewer** candidates unless at least one has importance score >= 8. An empty candidate list is always skipped.
|
|
180
180
|
|
|
181
181
|
## Crawling targets and parsers
|
|
182
182
|
|
|
@@ -270,7 +270,7 @@ npm run format # format src/ with Prettier
|
|
|
270
270
|
npm run format:check # check src/ formatting
|
|
271
271
|
```
|
|
272
272
|
|
|
273
|
-
The build emits ESM, declarations, and a JavaScript sourcemap; runtime dependencies remain external. CI runs `npm ci`, `format:check`, `lint:ci`, `typecheck`, and `build` on Node.js 24.x for pull requests and manual dispatch. Formatting scripts cover `src/`; to check the READMEs explicitly, run `npx prettier --check README.md README-ko.md`. There is no `npm test` script.
|
|
273
|
+
The build emits ESM, declarations, and a JavaScript sourcemap; runtime dependencies remain external. CI runs `npm ci`, `format:check`, `lint:ci`, `typecheck`, and `build` on the minimum supported Node.js version (24.15.0), the latest 24.x, and the latest 26.x for pull requests and manual dispatch. Formatting scripts cover `src/`; to check the READMEs explicitly, run `npx prettier --check README.md README-ko.md`. There is no `npm test` script.
|
|
274
274
|
|
|
275
275
|
For maintainers, `release` publishes to npm, while `release:patch`, `release:minor`, and `release:major` bump the version and publish. The version hooks build first and push commits/tags; `prepublishOnly` builds before publishing.
|
|
276
276
|
|
package/dist/index.js
CHANGED
|
@@ -2250,6 +2250,23 @@ const extractNttId = (html) => {
|
|
|
2250
2250
|
}
|
|
2251
2251
|
return '';
|
|
2252
2252
|
};
|
|
2253
|
+
/**
|
|
2254
|
+
* Reads a JSON body without trusting that it is JSON.
|
|
2255
|
+
*
|
|
2256
|
+
* These parsers fetch their own API through the crawling fetch, which does not
|
|
2257
|
+
* always carry the API's answer: a request the origin's robots.txt disallows is
|
|
2258
|
+
* answered locally with an empty document, and `response.json()` throws on it.
|
|
2259
|
+
* A refusal should leave the target with nothing to report, not raise a parse
|
|
2260
|
+
* error that reads like a broken parser.
|
|
2261
|
+
*/
|
|
2262
|
+
async function readJson(response) {
|
|
2263
|
+
try {
|
|
2264
|
+
return (await response.json());
|
|
2265
|
+
}
|
|
2266
|
+
catch {
|
|
2267
|
+
return null;
|
|
2268
|
+
}
|
|
2269
|
+
}
|
|
2253
2270
|
/**
|
|
2254
2271
|
* Parses the list page from seamuse.go.kr (국립해양유산연구소).
|
|
2255
2272
|
* The site uses client-side rendering — list data is fetched from a JSON API.
|
|
@@ -2267,9 +2284,9 @@ const parseSeamuseList = async (_html, listDataPath, infoPathPrefix, customFetch
|
|
|
2267
2284
|
},
|
|
2268
2285
|
body,
|
|
2269
2286
|
});
|
|
2270
|
-
const data = await response
|
|
2287
|
+
const data = await readJson(response);
|
|
2271
2288
|
const posts = [];
|
|
2272
|
-
for (const item of data
|
|
2289
|
+
for (const item of data?.resultList ?? []) {
|
|
2273
2290
|
posts.push({
|
|
2274
2291
|
uniqId: String(item.nttId),
|
|
2275
2292
|
title: item.nttSj?.trim() ?? '',
|
|
@@ -2302,11 +2319,11 @@ const parseSeamuseDetail = async (html, infoDataPath, customFetch) => {
|
|
|
2302
2319
|
'Content-Type': 'application/json',
|
|
2303
2320
|
},
|
|
2304
2321
|
});
|
|
2305
|
-
const data = await response
|
|
2306
|
-
const content = data
|
|
2322
|
+
const data = await readJson(response);
|
|
2323
|
+
const content = data?.result?.nttCn ?? '';
|
|
2307
2324
|
return {
|
|
2308
2325
|
detailContent: new TurndownService().turndown(content),
|
|
2309
|
-
hasAttachedFile: (data
|
|
2326
|
+
hasAttachedFile: (data?.files?.length ?? 0) > 0,
|
|
2310
2327
|
hasAttachedImage: content.includes('<img'),
|
|
2311
2328
|
};
|
|
2312
2329
|
};
|
|
@@ -4440,9 +4457,10 @@ class ContentGenerateProvider {
|
|
|
4440
4457
|
*
|
|
4441
4458
|
* Applied at the fetch layer, the same seam the KRAS and excavation-report
|
|
4442
4459
|
* adapters use, so core's crawling pipeline is untouched: a disallowed request
|
|
4443
|
-
* is answered with
|
|
4444
|
-
*
|
|
4445
|
-
*
|
|
4460
|
+
* is answered locally with an empty document instead of being sent, and the
|
|
4461
|
+
* target simply yields no articles. The refusal is reported through
|
|
4462
|
+
* `onBlocked`, not as a fetch failure — see {@link createRobotsGate} for why
|
|
4463
|
+
* that distinction matters.
|
|
4446
4464
|
*/
|
|
4447
4465
|
/**
|
|
4448
4466
|
* Parses robots.txt into user-agent groups.
|
|
@@ -4648,13 +4666,31 @@ function createRobotsGate(baseFetch = fetch, options = {}) {
|
|
|
4648
4666
|
return baseFetch(input, init);
|
|
4649
4667
|
}
|
|
4650
4668
|
onBlocked?.({ url: requestUrl, userAgent, rule: verdict.rule });
|
|
4651
|
-
|
|
4669
|
+
// An empty document rather than a 4xx. A site's crawling policy is not a
|
|
4670
|
+
// fault on our side, but core cannot tell the difference: it turns any
|
|
4671
|
+
// non-2xx list response into a thrown error and logs
|
|
4672
|
+
// `crawl.list.fetch.failed` at error level, which applications forward to
|
|
4673
|
+
// their alerting. Fourteen targets are disallowed at all times, so every
|
|
4674
|
+
// run raised fourteen alerts that no one could act on, and real fetch
|
|
4675
|
+
// failures were buried among them.
|
|
4676
|
+
//
|
|
4677
|
+
// Answering 200 with no content makes the target yield nothing, which is
|
|
4678
|
+
// what being disallowed means. The refusal is not hidden: it is still
|
|
4679
|
+
// reported through `onBlocked`, which the provider logs as
|
|
4680
|
+
// `crawl.robots.blocked`, and the health-check decides what to skip from
|
|
4681
|
+
// `isAllowed` rather than from this status. Every parser in this package
|
|
4682
|
+
// returns an empty list for this body.
|
|
4683
|
+
return new Response(`<!-- Blocked by robots.txt (${verdict.rule}) - ${new URL(requestUrl).origin}/robots.txt -->`, {
|
|
4684
|
+
status: 200,
|
|
4685
|
+
statusText: 'Blocked by robots.txt',
|
|
4686
|
+
headers: { 'content-type': 'text/html; charset=utf-8' },
|
|
4687
|
+
});
|
|
4652
4688
|
};
|
|
4653
4689
|
return { isAllowed, fetch: gatedFetch };
|
|
4654
4690
|
}
|
|
4655
4691
|
/**
|
|
4656
4692
|
* Wraps a fetch so that requests disallowed by the origin's robots.txt are
|
|
4657
|
-
*
|
|
4693
|
+
* answered with an empty document instead of sent. See {@link createRobotsGate}.
|
|
4658
4694
|
*/
|
|
4659
4695
|
function createRobotsAwareFetch(baseFetch = fetch, options = {}) {
|
|
4660
4696
|
return createRobotsGate(baseFetch, options).fetch;
|
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": "@heripo/research-radar",
|
|
3
3
|
"private": false,
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "5.2.
|
|
5
|
+
"version": "5.2.2",
|
|
6
6
|
"description": "AI-driven intelligence for Korean cultural heritage. This package serves as both a ready-to-use newsletter service and a practical implementation example for the LLM-Newsletter-Kit.",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
@@ -48,39 +48,39 @@
|
|
|
48
48
|
"author": "kimhongyeon",
|
|
49
49
|
"license": "Apache-2.0",
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@ai-sdk/anthropic": "^4.0.
|
|
52
|
-
"@ai-sdk/google": "^4.0.
|
|
53
|
-
"@ai-sdk/openai": "^4.0.
|
|
54
|
-
"ai": "^7.0.
|
|
51
|
+
"@ai-sdk/anthropic": "^4.0.58",
|
|
52
|
+
"@ai-sdk/google": "^4.0.76",
|
|
53
|
+
"@ai-sdk/openai": "^4.0.71",
|
|
54
|
+
"ai": "^7.0.107",
|
|
55
55
|
"cheerio": "^1.2.0",
|
|
56
|
-
"dompurify": "^3.4.
|
|
57
|
-
"jsdom": "^30.0
|
|
58
|
-
"juice": "^12.1.
|
|
59
|
-
"safe-markdown2html": "^1.0.
|
|
56
|
+
"dompurify": "^3.4.15",
|
|
57
|
+
"jsdom": "^30.1.0",
|
|
58
|
+
"juice": "^12.1.3",
|
|
59
|
+
"safe-markdown2html": "^1.0.13",
|
|
60
60
|
"turndown": "^7.2.4"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
|
-
"@llm-newsletter-kit/core": "~3.0.
|
|
63
|
+
"@llm-newsletter-kit/core": "~3.0.6"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@eslint/js": "^10.0.1",
|
|
67
|
-
"@llm-newsletter-kit/core": "^3.0.
|
|
67
|
+
"@llm-newsletter-kit/core": "^3.0.6",
|
|
68
68
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
|
69
69
|
"@types/express": "^5.0.6",
|
|
70
70
|
"@types/jsdom": "^30.0.0",
|
|
71
|
-
"@types/node": "^26.
|
|
71
|
+
"@types/node": "^26.6.2",
|
|
72
72
|
"@types/turndown": "^5.0.6",
|
|
73
|
-
"eslint": "^10.
|
|
73
|
+
"eslint": "^10.11.0",
|
|
74
74
|
"eslint-plugin-unused-imports": "^4.4.1",
|
|
75
75
|
"express": "^5.2.1",
|
|
76
|
-
"prettier": "^3.9.
|
|
76
|
+
"prettier": "^3.9.8",
|
|
77
77
|
"rimraf": "^6.1.3",
|
|
78
|
-
"rollup": "^4.63.
|
|
78
|
+
"rollup": "^4.63.4",
|
|
79
79
|
"rollup-plugin-dts": "^6.5.1",
|
|
80
80
|
"rollup-plugin-typescript2": "^0.37.0",
|
|
81
81
|
"tsx": "^4.23.13",
|
|
82
82
|
"typescript": "^6.0.3",
|
|
83
|
-
"typescript-eslint": "^8.
|
|
83
|
+
"typescript-eslint": "^8.70.0"
|
|
84
84
|
},
|
|
85
85
|
"repository": {
|
|
86
86
|
"type": "git",
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
"example"
|
|
110
110
|
],
|
|
111
111
|
"engines": {
|
|
112
|
-
"node": ">=
|
|
112
|
+
"node": "^24.15.0 || >=26.0.0"
|
|
113
113
|
},
|
|
114
114
|
"publishConfig": {
|
|
115
115
|
"access": "public"
|