openclaw-github-trending 1.0.0 → 1.0.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-github-trending",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "OpenClaw plugin for fetching GitHub trending repositories and pushing to Feishu or Email with AI summaries",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/dist/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAAA,2CAAwC;AAExC,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEjC;;;GAGG;AACH,KAAK,UAAU,QAAQ,CAAC,OAAY;IAClC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAE3D,kCAAkC;IAClC,OAAO;SACJ,OAAO,CAAC,0CAA0C,CAAC;SACnD,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAY,EAAE,QAAiB,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC7C,KAAK;gBACL,IAAI;gBACJ,QAAQ;aACT,CAAC,CAAC;YAEH,iBAAiB;YACjB,MAAM,WAAW,GAAG,QAAQ;gBAC1B,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAChE,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAExB,2BAA2B;YAC3B,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C,OAAO,CAAC,KAAK,CAAC,oBAAoB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9D,OAAO,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;gBAC3F,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;gBAC/E,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;gBAClF,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,+BAA+B;YAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;gBAErE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,qCAAqC,KAAK,QAAQ,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvF,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;gBAEtE,mEAAmE;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,sBAAsB;gBACtB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,IAAI,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC9E,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACnF,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;AACtE,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,OAAO,GAAG;IACf,IAAI,EAAE,gBAAgB;IACtB,QAAQ;CACT,CAAC"}
@@ -1,87 +0,0 @@
1
- /**
2
- * Service layer parameters for executing GitHub trending workflow
3
- */
4
- export interface ServiceParams {
5
- /**
6
- * Time period for trending repositories
7
- */
8
- since: 'daily' | 'weekly' | 'monthly';
9
- /**
10
- * Channels to push to (supports multiple channels)
11
- */
12
- channels: ('feishu' | 'email')[];
13
- }
14
- /**
15
- * Service layer result structure
16
- */
17
- export interface ServiceResult {
18
- /**
19
- * Overall success status (at least one channel succeeded)
20
- */
21
- success: boolean;
22
- /**
23
- * Number of repositories that were pushed (new + re-pushed)
24
- */
25
- pushedCount: number;
26
- /**
27
- * Number of newly seen repositories
28
- */
29
- newCount: number;
30
- /**
31
- * Number of already seen repositories
32
- */
33
- seenCount: number;
34
- /**
35
- * Total number of repositories found
36
- */
37
- totalCount: number;
38
- /**
39
- * Results for each channel push attempt
40
- */
41
- pushResults: {
42
- /**
43
- * Channel name (feishu or email)
44
- */
45
- channel: string;
46
- /**
47
- * Push success status
48
- */
49
- success: boolean;
50
- /**
51
- * Message ID from the channel (if applicable)
52
- */
53
- messageId?: string;
54
- /**
55
- * Error message if push failed
56
- */
57
- error?: string;
58
- }[];
59
- /**
60
- * Timestamp of execution
61
- */
62
- timestamp: string;
63
- /**
64
- * Human-readable success message
65
- */
66
- message?: string;
67
- /**
68
- * Error message if execution failed
69
- */
70
- error?: string;
71
- }
72
- /**
73
- * Storage interface for history persistence
74
- */
75
- export interface StorageInterface {
76
- get(key: string): Promise<any>;
77
- set(key: string, value: any): Promise<void>;
78
- }
79
- /**
80
- * Logger interface for consistent logging
81
- */
82
- export interface LoggerInterface {
83
- info(msg: string, ...args: any[]): void;
84
- warn(msg: string, ...args: any[]): void;
85
- error(msg: string, ...args: any[]): void;
86
- }
87
- //# sourceMappingURL=service.types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.types.d.ts","sourceRoot":"","sources":["../../src/models/service.types.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAEtC;;OAEG;IACH,QAAQ,EAAE,CAAC,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,WAAW,EAAE;QACX;;WAEG;QACH,OAAO,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,OAAO,EAAE,OAAO,CAAC;QAEjB;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,CAAC;QAEnB;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;IAEJ;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;CAC1C"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=service.types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.types.js","sourceRoot":"","sources":["../../src/models/service.types.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- import { OpenClawGlobalConfig } from '../core/config';
2
- import { PluginConfig } from '../models/config';
3
- import { StorageInterface, LoggerInterface, ServiceParams, ServiceResult } from '../models/service.types';
4
- /**
5
- * TrendingService - Core business logic service for GitHub trending workflow
6
- *
7
- * This service encapsulates the complete business flow:
8
- * 1. Fetch trending repositories
9
- * 2. Categorize using history
10
- * 3. Generate AI summaries
11
- * 4. Push to channels
12
- * 5. Update history
13
- *
14
- * It is a stateless service - all dependencies are injected via parameters.
15
- */
16
- export declare class TrendingService {
17
- /**
18
- * Execute the complete GitHub trending workflow
19
- *
20
- * @param params - Business parameters (already validated)
21
- * @param config - Valid plugin configuration
22
- * @param storage - OpenClaw storage interface
23
- * @param logger - Logger interface for consistent logging
24
- * @param openclawConfig - OpenClaw global configuration (optional)
25
- * @returns Structured execution result
26
- */
27
- static execute(params: ServiceParams, config: PluginConfig, storage: StorageInterface, logger: LoggerInterface, openclawConfig?: OpenClawGlobalConfig): Promise<ServiceResult>;
28
- }
29
- //# sourceMappingURL=trending.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trending.service.d.ts","sourceRoot":"","sources":["../../src/services/trending.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG1G;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAC1B;;;;;;;;;OASG;WACU,OAAO,CAClB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,oBAAoB,GACpC,OAAO,CAAC,aAAa,CAAC;CAmT1B"}
@@ -1,306 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TrendingService = void 0;
4
- const history_1 = require("../core/history");
5
- const fetcher_1 = require("../core/fetcher");
6
- const summarizer_1 = require("../core/summarizer");
7
- const feishu_1 = require("../channels/feishu");
8
- const email_1 = require("../channels/email");
9
- const config_1 = require("../core/config");
10
- /**
11
- * TrendingService - Core business logic service for GitHub trending workflow
12
- *
13
- * This service encapsulates the complete business flow:
14
- * 1. Fetch trending repositories
15
- * 2. Categorize using history
16
- * 3. Generate AI summaries
17
- * 4. Push to channels
18
- * 5. Update history
19
- *
20
- * It is a stateless service - all dependencies are injected via parameters.
21
- */
22
- class TrendingService {
23
- /**
24
- * Execute the complete GitHub trending workflow
25
- *
26
- * @param params - Business parameters (already validated)
27
- * @param config - Valid plugin configuration
28
- * @param storage - OpenClaw storage interface
29
- * @param logger - Logger interface for consistent logging
30
- * @param openclawConfig - OpenClaw global configuration (optional)
31
- * @returns Structured execution result
32
- */
33
- static async execute(params, config, storage, logger, openclawConfig) {
34
- try {
35
- // 1. Initialize history manager
36
- const historyManager = new history_1.HistoryManager();
37
- if (storage) {
38
- const historyData = await storage.get('github-trending-history');
39
- if (historyData) {
40
- historyManager.importData(historyData);
41
- }
42
- }
43
- // 2. Resolve AI configuration
44
- const aiConfig = config_1.ConfigManager.getAIConfig(config, openclawConfig);
45
- if (!aiConfig.apiKey) {
46
- logger.error('AI API key not found');
47
- return {
48
- success: false,
49
- pushedCount: 0,
50
- newCount: 0,
51
- seenCount: 0,
52
- totalCount: 0,
53
- pushResults: [],
54
- timestamp: new Date().toISOString(),
55
- error: 'AI API key is required. Please configure it in plugin settings, OpenClaw global config, or environment variables (OPENAI_API_KEY or ANTHROPIC_API_KEY).'
56
- };
57
- }
58
- logger.info(`Using AI provider: ${aiConfig.provider}, model: ${aiConfig.model}`);
59
- // 3. Fetch trending repositories
60
- logger.info(`Fetching GitHub trending repositories (${params.since})`);
61
- const fetcher = new fetcher_1.GitHubFetcher(config);
62
- const repositories = await fetcher.fetchTrending(params.since);
63
- // 4. Categorize repositories into new entries and continuous chart-toppers
64
- const historyConfig = {
65
- enabled: config?.history?.enabled ?? true,
66
- star_threshold: config?.history?.star_threshold ?? 100
67
- };
68
- const { newEntries, continuousChartToppers, alreadySeen } = historyManager.categorizeRepositories(repositories, historyConfig);
69
- const shouldPush = [...newEntries, ...continuousChartToppers.map(item => item.repo)];
70
- logger.info(`Found ${repositories.length} repos, ${shouldPush.length} to push (${newEntries.length} new, ${continuousChartToppers.length} continuous)`);
71
- // Log detailed repository information
72
- logger.info('Detailed repository list:');
73
- repositories.forEach((repo, index) => {
74
- logger.info(` ${index + 1}. ${repo.full_name}`);
75
- logger.info(` Stars: ${repo.stars.toLocaleString()} | Description: ${repo.description || 'N/A'}`);
76
- });
77
- logger.info('Categorization results:');
78
- if (newEntries.length > 0) {
79
- logger.info(` 🆕 New entries (${newEntries.length}) - Will generate AI summary:`);
80
- newEntries.forEach((repo, idx) => {
81
- logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars)`);
82
- });
83
- }
84
- if (continuousChartToppers.length > 0) {
85
- logger.info(` 🔥 Continuous chart-toppers (${continuousChartToppers.length}) - Use cached brief intro:`);
86
- continuousChartToppers.forEach(({ repo, history }, idx) => {
87
- const starsDiff = repo.stars - history.last_stars;
88
- logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars, +${starsDiff} since last, pushed ${history.push_count} times)`);
89
- });
90
- }
91
- if (alreadySeen.length > 0) {
92
- logger.info(` ⏭️ Already seen (${alreadySeen.length}) - Skipped:`);
93
- alreadySeen.forEach((repo, idx) => {
94
- const history = historyManager.getProject(repo.full_name);
95
- const starsDiff = repo.stars - (history?.last_stars || 0);
96
- logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars, +${starsDiff} since last)`);
97
- });
98
- }
99
- // 5. Generate AI summaries ONLY for new entries
100
- const summarizer = new summarizer_1.AISummarizer(aiConfig);
101
- const maxWorkers = config_1.ConfigManager.getMaxWorkers(config);
102
- const aiSummaries = new Map();
103
- logger.info(`Generating AI summaries for ${newEntries.length} new entries with ${maxWorkers} workers...`);
104
- // Process new entries in batches with concurrency control
105
- for (let i = 0; i < newEntries.length; i += maxWorkers) {
106
- const batch = newEntries.slice(i, i + maxWorkers);
107
- logger.info(`[Batch ${Math.floor(i / maxWorkers) + 1}/${Math.ceil(newEntries.length / maxWorkers)}] Processing ${batch.length} new repositories...`);
108
- const batchResults = await Promise.allSettled(batch.map(async (repo) => {
109
- try {
110
- logger.info(` 📖 [${repo.full_name}] Fetching README...`);
111
- const readmeContent = await fetcher.fetchReadme(repo.full_name);
112
- let summary = '';
113
- if (readmeContent) {
114
- const readmePreview = readmeContent.substring(0, 100).replace(/\n/g, ' ').trim();
115
- logger.info(` ✓ README found (${readmeContent.length} chars), preview: "${readmePreview}..."`);
116
- logger.info(` 🤖 [${repo.full_name}] Generating AI summary from README...`);
117
- const startTime = Date.now();
118
- summary = await summarizer.summarizeReadme(repo.full_name, readmeContent);
119
- const duration = Date.now() - startTime;
120
- logger.info(` ✓ Summary generated (${summary.length} chars) in ${duration}ms`);
121
- if (summary) {
122
- logger.info(` 📝 [${repo.full_name}] Summary: ${summary.substring(0, 100)}...`);
123
- aiSummaries.set(repo.full_name, summary);
124
- repo.ai_summary = summary;
125
- }
126
- else {
127
- logger.warn(` ⚠ [${repo.full_name}] Summary is empty`);
128
- }
129
- }
130
- else {
131
- logger.warn(` ✗ No README found for ${repo.full_name}`);
132
- logger.info(` 🤖 [${repo.full_name}] Generating AI summary from metadata...`);
133
- const startTime = Date.now();
134
- summary = await summarizer.generateSummary(repo);
135
- const duration = Date.now() - startTime;
136
- logger.info(` ✓ Summary generated (${summary.length} chars) in ${duration}ms`);
137
- if (summary) {
138
- logger.info(` 📝 [${repo.full_name}] Summary: ${summary.substring(0, 100)}...`);
139
- }
140
- else {
141
- logger.warn(` ⚠ [${repo.full_name}] Summary is empty`);
142
- }
143
- }
144
- return { ...repo, ai_summary: summary };
145
- }
146
- catch (error) {
147
- logger.error(` ❌ [${repo.full_name}] Failed to generate summary: ${error}`);
148
- return { ...repo, ai_summary: '' };
149
- }
150
- }));
151
- // Collect results from this batch
152
- for (const result of batchResults) {
153
- if (result.status === 'fulfilled') {
154
- reposWithSummary.push(result.value);
155
- }
156
- }
157
- }
158
- // 6. Push to channels
159
- const seenWithSummary = alreadySeen.map(r => ({
160
- ...r,
161
- ai_summary: historyManager.getProject(r.full_name)?.ai_summary || ''
162
- }));
163
- const pushResults = [];
164
- for (const targetChannel of params.channels) {
165
- try {
166
- if (targetChannel === 'feishu') {
167
- const webhookUrl = config?.channels?.feishu?.webhook_url;
168
- if (!webhookUrl) {
169
- logger.warn('Feishu webhook URL not configured, skipping');
170
- pushResults.push({ channel: 'feishu', success: false, error: 'Webhook URL not configured' });
171
- continue;
172
- }
173
- logger.info(`Pushing ${reposWithSummary.length} repos to Feishu...`);
174
- const result = await feishu_1.FeishuChannel.push(webhookUrl, reposWithSummary, seenWithSummary, params.since);
175
- if (!result) {
176
- logger.error('FeishuChannel.push returned undefined!');
177
- pushResults.push({ channel: 'feishu', success: false, error: 'Push returned undefined' });
178
- continue;
179
- }
180
- pushResults.push({
181
- channel: 'feishu',
182
- success: result.success,
183
- messageId: result.messageId,
184
- error: result.error || undefined
185
- });
186
- if (result.success) {
187
- logger.info(`✅ Feishu push successful!`);
188
- }
189
- else {
190
- logger.error(`❌ Feishu push failed: ${result.error || 'Unknown error'}`);
191
- }
192
- }
193
- else if (targetChannel === 'email') {
194
- const emailTo = config?.channels?.email?.recipient || config?.channels?.email?.sender;
195
- if (!emailTo) {
196
- logger.warn('Email recipient not configured, skipping');
197
- pushResults.push({ channel: 'email', success: false, error: 'Recipient not configured' });
198
- continue;
199
- }
200
- if (!config?.channels?.email) {
201
- logger.warn('Email SMTP configuration missing, skipping');
202
- pushResults.push({ channel: 'email', success: false, error: 'SMTP configuration missing' });
203
- continue;
204
- }
205
- if (!config.channels.email.password) {
206
- logger.warn('Email SMTP password missing, skipping');
207
- pushResults.push({ channel: 'email', success: false, error: 'SMTP password not configured' });
208
- continue;
209
- }
210
- logger.info(`Sending email...`);
211
- logger.info(` From: ${config.channels.email.sender}`);
212
- logger.info(` To: ${emailTo}`);
213
- logger.info(` Subject: GitHub Trending ${params.since === 'daily' ? 'Daily' : params.since === 'weekly' ? 'Weekly' : 'Monthly'}`);
214
- logger.info(` Repositories: ${reposWithSummary.length} new + ${alreadySeen.length} seen`);
215
- const result = await email_1.EmailChannel.send({
216
- from: config.channels.email.sender,
217
- to: emailTo,
218
- subject: `GitHub ${params.since === 'daily' ? '今日' : params.since === 'weekly' ? '本周' : '本月'}热榜推送`,
219
- smtp: {
220
- host: config.channels.email.smtp_host || 'smtp.qq.com',
221
- port: config.channels.email.smtp_port || 587,
222
- secure: false,
223
- auth: {
224
- user: config.channels.email.sender,
225
- pass: config.channels.email.password
226
- }
227
- }
228
- }, reposWithSummary, seenWithSummary, params.since);
229
- pushResults.push({
230
- channel: 'email',
231
- success: result.success,
232
- messageId: result.messageId,
233
- error: result.error || undefined
234
- });
235
- if (result.success) {
236
- logger.info(`Email sent successfully! Message ID: ${result.messageId || 'N/A'}`);
237
- logger.info(`Check inbox: ${emailTo}`);
238
- if (emailTo === config.channels.email.sender) {
239
- logger.warn(`Email was sent to sender (self). To send to others, set EMAIL_TO in .env`);
240
- }
241
- }
242
- else {
243
- logger.error(`Failed to send email: ${result.error || 'Unknown error'}`);
244
- }
245
- }
246
- }
247
- catch (error) {
248
- logger.error(`Failed to push to ${targetChannel}: ${error}`);
249
- pushResults.push({
250
- channel: targetChannel,
251
- success: false,
252
- error: error instanceof Error ? error.message : 'Unknown error'
253
- });
254
- }
255
- }
256
- // 7. Update history
257
- historyManager.markPushed(reposWithSummary);
258
- if (storage) {
259
- await storage.set('github-trending-history', historyManager.exportData());
260
- }
261
- // 8. Return result
262
- const successCount = pushResults.filter(r => r.success).length;
263
- const failedChannels = pushResults.filter(r => !r.success).map(r => r.channel);
264
- logger.info('Execution completed', {
265
- successCount,
266
- failedCount: failedChannels.length,
267
- totalChannels: params.channels.length,
268
- pushedCount: reposWithSummary.length,
269
- newCount: newlySeen.length,
270
- seenCount: alreadySeen.length
271
- });
272
- return {
273
- success: successCount > 0,
274
- pushedCount: reposWithSummary.length,
275
- newCount: newlySeen.length,
276
- seenCount: alreadySeen.length,
277
- totalCount: repositories.length,
278
- pushResults,
279
- timestamp: new Date().toISOString(),
280
- message: successCount === params.channels.length
281
- ? `成功推送到所有 ${successCount} 个通道`
282
- : successCount > 0
283
- ? `部分成功:${successCount}/${params.channels.length} 个通道推送成功,失败通道:${failedChannels.join(', ')}`
284
- : `所有通道推送失败:${failedChannels.join(', ')}`
285
- };
286
- }
287
- catch (error) {
288
- logger.error('Execution failed', {
289
- error: error instanceof Error ? error.message : 'Unknown error',
290
- stack: error instanceof Error ? error.stack : undefined
291
- });
292
- return {
293
- success: false,
294
- pushedCount: 0,
295
- newCount: 0,
296
- seenCount: 0,
297
- totalCount: 0,
298
- pushResults: [],
299
- timestamp: new Date().toISOString(),
300
- error: error instanceof Error ? error.message : 'Unknown error'
301
- };
302
- }
303
- }
304
- }
305
- exports.TrendingService = TrendingService;
306
- //# sourceMappingURL=trending.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trending.service.js","sourceRoot":"","sources":["../../src/services/trending.service.ts"],"names":[],"mappings":"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"}