@nahisaho/yata-global 1.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/api-client.d.ts +71 -0
  2. package/dist/api-client.d.ts.map +1 -0
  3. package/dist/api-client.js +165 -0
  4. package/dist/api-client.js.map +1 -0
  5. package/dist/cache-manager.d.ts +122 -0
  6. package/dist/cache-manager.d.ts.map +1 -0
  7. package/dist/cache-manager.js +376 -0
  8. package/dist/cache-manager.js.map +1 -0
  9. package/dist/index.d.ts +138 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +548 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/kgpr/index.d.ts +12 -0
  14. package/dist/kgpr/index.d.ts.map +1 -0
  15. package/dist/kgpr/index.js +12 -0
  16. package/dist/kgpr/index.js.map +1 -0
  17. package/dist/kgpr/kgpr-manager.d.ts +162 -0
  18. package/dist/kgpr/kgpr-manager.d.ts.map +1 -0
  19. package/dist/kgpr/kgpr-manager.js +465 -0
  20. package/dist/kgpr/kgpr-manager.js.map +1 -0
  21. package/dist/kgpr/merge-engine.d.ts +269 -0
  22. package/dist/kgpr/merge-engine.d.ts.map +1 -0
  23. package/dist/kgpr/merge-engine.js +451 -0
  24. package/dist/kgpr/merge-engine.js.map +1 -0
  25. package/dist/kgpr/notification-service.d.ts +227 -0
  26. package/dist/kgpr/notification-service.d.ts.map +1 -0
  27. package/dist/kgpr/notification-service.js +440 -0
  28. package/dist/kgpr/notification-service.js.map +1 -0
  29. package/dist/kgpr/privacy-filter.d.ts +61 -0
  30. package/dist/kgpr/privacy-filter.d.ts.map +1 -0
  31. package/dist/kgpr/privacy-filter.js +191 -0
  32. package/dist/kgpr/privacy-filter.js.map +1 -0
  33. package/dist/kgpr/types.d.ts +303 -0
  34. package/dist/kgpr/types.d.ts.map +1 -0
  35. package/dist/kgpr/types.js +40 -0
  36. package/dist/kgpr/types.js.map +1 -0
  37. package/dist/sync-engine.d.ts +104 -0
  38. package/dist/sync-engine.d.ts.map +1 -0
  39. package/dist/sync-engine.js +275 -0
  40. package/dist/sync-engine.js.map +1 -0
  41. package/dist/types.d.ts +353 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +19 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +59 -0
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Knowledge Graph Pull Request (KGPR) - Notification Service
3
+ *
4
+ * Multi-channel notification system for KGPR events
5
+ *
6
+ * @packageDocumentation
7
+ * @module @nahisaho/yata-global/kgpr
8
+ *
9
+ * @see REQ-KGPR-003
10
+ * @see TSK-KGPR-005
11
+ */
12
+ import { EventEmitter } from 'events';
13
+ /**
14
+ * Notification event types
15
+ */
16
+ export type NotificationEventType = 'KGPR_CREATED' | 'KGPR_SUBMITTED' | 'KGPR_REVIEWED' | 'KGPR_APPROVED' | 'KGPR_CHANGES_REQUESTED' | 'KGPR_MERGED' | 'KGPR_CLOSED' | 'KGPR_COMMENTED';
17
+ /**
18
+ * Notification payload
19
+ */
20
+ export interface NotificationPayload {
21
+ /** Event type */
22
+ type: NotificationEventType;
23
+ /** KGPR ID */
24
+ kgprId: string;
25
+ /** KGPR title */
26
+ title?: string;
27
+ /** Event message */
28
+ message?: string;
29
+ /** Author ID */
30
+ authorId?: string;
31
+ /** Author name */
32
+ authorName?: string;
33
+ /** Additional metadata */
34
+ metadata?: Record<string, unknown>;
35
+ /** Event timestamp */
36
+ timestamp?: Date;
37
+ }
38
+ /**
39
+ * Notification channel interface
40
+ */
41
+ export interface NotificationChannel {
42
+ /** Channel name */
43
+ readonly name: string;
44
+ /** Send notification */
45
+ send(payload: NotificationPayload): Promise<NotificationResult>;
46
+ /** Check if channel is enabled */
47
+ isEnabled(): boolean;
48
+ }
49
+ /**
50
+ * Notification result
51
+ */
52
+ export interface NotificationResult {
53
+ /** Whether notification was sent successfully */
54
+ success: boolean;
55
+ /** Channel name */
56
+ channel: string;
57
+ /** Error message (if failed) */
58
+ error?: string;
59
+ /** Response data (if available) */
60
+ response?: unknown;
61
+ }
62
+ /**
63
+ * Notification service configuration
64
+ */
65
+ export interface NotificationServiceConfig {
66
+ /** Webhook URL for HTTP notifications */
67
+ webhookUrl?: string;
68
+ /** Webhook headers */
69
+ webhookHeaders?: Record<string, string>;
70
+ /** File path for file-based notifications */
71
+ filePath?: string;
72
+ /** Enable CLI output */
73
+ cliEnabled?: boolean;
74
+ /** CLI output stream (default: process.stdout) */
75
+ cliStream?: NodeJS.WritableStream;
76
+ /** Enable colored CLI output */
77
+ cliColored?: boolean;
78
+ }
79
+ /**
80
+ * CLI Notification Channel
81
+ *
82
+ * Outputs notifications to the terminal/console
83
+ */
84
+ export declare class CLINotificationChannel implements NotificationChannel {
85
+ readonly name = "cli";
86
+ private enabled;
87
+ private stream;
88
+ private colored;
89
+ constructor(options?: {
90
+ enabled?: boolean;
91
+ stream?: NodeJS.WritableStream;
92
+ colored?: boolean;
93
+ });
94
+ isEnabled(): boolean;
95
+ send(payload: NotificationPayload): Promise<NotificationResult>;
96
+ private formatMessage;
97
+ private formatEventType;
98
+ private getTypeColor;
99
+ private dim;
100
+ private reset;
101
+ }
102
+ /**
103
+ * Webhook Notification Channel
104
+ *
105
+ * Sends notifications via HTTP webhook
106
+ */
107
+ export declare class WebhookNotificationChannel implements NotificationChannel {
108
+ readonly name = "webhook";
109
+ private url;
110
+ private headers;
111
+ private enabled;
112
+ constructor(options: {
113
+ url: string;
114
+ headers?: Record<string, string>;
115
+ enabled?: boolean;
116
+ });
117
+ isEnabled(): boolean;
118
+ send(payload: NotificationPayload): Promise<NotificationResult>;
119
+ }
120
+ /**
121
+ * File Notification Channel
122
+ *
123
+ * Appends notifications to a log file
124
+ */
125
+ export declare class FileNotificationChannel implements NotificationChannel {
126
+ readonly name = "file";
127
+ private filePath;
128
+ private enabled;
129
+ constructor(options: {
130
+ filePath: string;
131
+ enabled?: boolean;
132
+ });
133
+ isEnabled(): boolean;
134
+ send(payload: NotificationPayload): Promise<NotificationResult>;
135
+ private formatEntry;
136
+ }
137
+ /**
138
+ * NotificationService events
139
+ */
140
+ export interface NotificationServiceEvents {
141
+ 'notification:sent': {
142
+ payload: NotificationPayload;
143
+ results: NotificationResult[];
144
+ };
145
+ 'notification:failed': {
146
+ payload: NotificationPayload;
147
+ errors: NotificationResult[];
148
+ };
149
+ 'error': Error;
150
+ }
151
+ /**
152
+ * Notification Service
153
+ *
154
+ * Multi-channel notification system for KGPR events
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * const service = new NotificationService({
159
+ * webhookUrl: 'https://example.com/webhook',
160
+ * cliEnabled: true,
161
+ * filePath: './notifications.log',
162
+ * });
163
+ *
164
+ * await service.notify({
165
+ * type: 'KGPR_SUBMITTED',
166
+ * kgprId: 'KGPR-20260106-001',
167
+ * title: 'Add user authentication',
168
+ * });
169
+ * ```
170
+ */
171
+ export declare class NotificationService extends EventEmitter {
172
+ private channels;
173
+ constructor(config?: NotificationServiceConfig);
174
+ /**
175
+ * Add a notification channel
176
+ */
177
+ addChannel(channel: NotificationChannel): void;
178
+ /**
179
+ * Remove a notification channel
180
+ */
181
+ removeChannel(name: string): boolean;
182
+ /**
183
+ * Get a notification channel by name
184
+ */
185
+ getChannel(name: string): NotificationChannel | undefined;
186
+ /**
187
+ * List all registered channels
188
+ */
189
+ listChannels(): NotificationChannel[];
190
+ /**
191
+ * Send notification to all enabled channels
192
+ */
193
+ notify(payload: NotificationPayload): Promise<NotificationResult[]>;
194
+ /**
195
+ * Send notification to specific channel only
196
+ */
197
+ notifyChannel(channelName: string, payload: NotificationPayload): Promise<NotificationResult>;
198
+ /**
199
+ * Notify KGPR created
200
+ */
201
+ notifyCreated(kgprId: string, title: string, authorName?: string): Promise<NotificationResult[]>;
202
+ /**
203
+ * Notify KGPR submitted
204
+ */
205
+ notifySubmitted(kgprId: string, title: string, authorName?: string): Promise<NotificationResult[]>;
206
+ /**
207
+ * Notify KGPR approved
208
+ */
209
+ notifyApproved(kgprId: string, title: string, reviewerName?: string): Promise<NotificationResult[]>;
210
+ /**
211
+ * Notify changes requested
212
+ */
213
+ notifyChangesRequested(kgprId: string, title: string, reviewerName?: string, comment?: string): Promise<NotificationResult[]>;
214
+ /**
215
+ * Notify KGPR merged
216
+ */
217
+ notifyMerged(kgprId: string, title: string): Promise<NotificationResult[]>;
218
+ /**
219
+ * Notify KGPR closed
220
+ */
221
+ notifyClosed(kgprId: string, title: string, reason?: string): Promise<NotificationResult[]>;
222
+ /**
223
+ * Notify new comment
224
+ */
225
+ notifyCommented(kgprId: string, title: string, commenterName: string, comment: string): Promise<NotificationResult[]>;
226
+ }
227
+ //# sourceMappingURL=notification-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service.d.ts","sourceRoot":"","sources":["../../src/kgpr/notification-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,440 @@
1
+ /**
2
+ * Knowledge Graph Pull Request (KGPR) - Notification Service
3
+ *
4
+ * Multi-channel notification system for KGPR events
5
+ *
6
+ * @packageDocumentation
7
+ * @module @nahisaho/yata-global/kgpr
8
+ *
9
+ * @see REQ-KGPR-003
10
+ * @see TSK-KGPR-005
11
+ */
12
+ import { EventEmitter } from 'events';
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ // ============================================================================
16
+ // CLI Notification Channel
17
+ // ============================================================================
18
+ /**
19
+ * CLI Notification Channel
20
+ *
21
+ * Outputs notifications to the terminal/console
22
+ */
23
+ export class CLINotificationChannel {
24
+ name = 'cli';
25
+ enabled;
26
+ stream;
27
+ colored;
28
+ constructor(options = {}) {
29
+ this.enabled = options.enabled ?? true;
30
+ this.stream = options.stream ?? process.stdout;
31
+ this.colored = options.colored ?? true;
32
+ }
33
+ isEnabled() {
34
+ return this.enabled;
35
+ }
36
+ async send(payload) {
37
+ if (!this.enabled) {
38
+ return { success: false, channel: this.name, error: 'Channel disabled' };
39
+ }
40
+ try {
41
+ const message = this.formatMessage(payload);
42
+ this.stream.write(message + '\n');
43
+ return { success: true, channel: this.name };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ success: false,
48
+ channel: this.name,
49
+ error: error instanceof Error ? error.message : 'Unknown error',
50
+ };
51
+ }
52
+ }
53
+ formatMessage(payload) {
54
+ const timestamp = (payload.timestamp ?? new Date()).toISOString();
55
+ const typeLabel = this.formatEventType(payload.type);
56
+ const titlePart = payload.title ? ` - ${payload.title}` : '';
57
+ const messagePart = payload.message ? `\n ${payload.message}` : '';
58
+ if (this.colored) {
59
+ const color = this.getTypeColor(payload.type);
60
+ return `${this.dim(timestamp)} ${color}[${typeLabel}]${this.reset()} ${payload.kgprId}${titlePart}${messagePart}`;
61
+ }
62
+ return `${timestamp} [${typeLabel}] ${payload.kgprId}${titlePart}${messagePart}`;
63
+ }
64
+ formatEventType(type) {
65
+ return type.replace('KGPR_', '').replace(/_/g, ' ');
66
+ }
67
+ getTypeColor(type) {
68
+ switch (type) {
69
+ case 'KGPR_CREATED':
70
+ return '\x1b[36m'; // Cyan
71
+ case 'KGPR_SUBMITTED':
72
+ return '\x1b[33m'; // Yellow
73
+ case 'KGPR_REVIEWED':
74
+ return '\x1b[34m'; // Blue
75
+ case 'KGPR_APPROVED':
76
+ return '\x1b[32m'; // Green
77
+ case 'KGPR_CHANGES_REQUESTED':
78
+ return '\x1b[31m'; // Red
79
+ case 'KGPR_MERGED':
80
+ return '\x1b[35m'; // Magenta
81
+ case 'KGPR_CLOSED':
82
+ return '\x1b[90m'; // Gray
83
+ case 'KGPR_COMMENTED':
84
+ return '\x1b[37m'; // White
85
+ default:
86
+ return '\x1b[0m'; // Reset
87
+ }
88
+ }
89
+ dim(text) {
90
+ return `\x1b[2m${text}\x1b[22m`;
91
+ }
92
+ reset() {
93
+ return '\x1b[0m';
94
+ }
95
+ }
96
+ // ============================================================================
97
+ // Webhook Notification Channel
98
+ // ============================================================================
99
+ /**
100
+ * Webhook Notification Channel
101
+ *
102
+ * Sends notifications via HTTP webhook
103
+ */
104
+ export class WebhookNotificationChannel {
105
+ name = 'webhook';
106
+ url;
107
+ headers;
108
+ enabled;
109
+ constructor(options) {
110
+ this.url = options.url;
111
+ this.headers = options.headers ?? {};
112
+ this.enabled = options.enabled ?? true;
113
+ }
114
+ isEnabled() {
115
+ return this.enabled && !!this.url;
116
+ }
117
+ async send(payload) {
118
+ if (!this.isEnabled()) {
119
+ return { success: false, channel: this.name, error: 'Channel disabled or URL not configured' };
120
+ }
121
+ try {
122
+ const body = JSON.stringify({
123
+ ...payload,
124
+ timestamp: (payload.timestamp ?? new Date()).toISOString(),
125
+ });
126
+ const response = await fetch(this.url, {
127
+ method: 'POST',
128
+ headers: {
129
+ 'Content-Type': 'application/json',
130
+ ...this.headers,
131
+ },
132
+ body,
133
+ });
134
+ if (!response.ok) {
135
+ return {
136
+ success: false,
137
+ channel: this.name,
138
+ error: `HTTP ${response.status}: ${response.statusText}`,
139
+ response: { status: response.status, statusText: response.statusText },
140
+ };
141
+ }
142
+ let responseData;
143
+ try {
144
+ responseData = await response.json();
145
+ }
146
+ catch {
147
+ responseData = await response.text();
148
+ }
149
+ return {
150
+ success: true,
151
+ channel: this.name,
152
+ response: responseData,
153
+ };
154
+ }
155
+ catch (error) {
156
+ return {
157
+ success: false,
158
+ channel: this.name,
159
+ error: error instanceof Error ? error.message : 'Unknown error',
160
+ };
161
+ }
162
+ }
163
+ }
164
+ // ============================================================================
165
+ // File Notification Channel
166
+ // ============================================================================
167
+ /**
168
+ * File Notification Channel
169
+ *
170
+ * Appends notifications to a log file
171
+ */
172
+ export class FileNotificationChannel {
173
+ name = 'file';
174
+ filePath;
175
+ enabled;
176
+ constructor(options) {
177
+ this.filePath = options.filePath;
178
+ this.enabled = options.enabled ?? true;
179
+ }
180
+ isEnabled() {
181
+ return this.enabled && !!this.filePath;
182
+ }
183
+ async send(payload) {
184
+ if (!this.isEnabled()) {
185
+ return { success: false, channel: this.name, error: 'Channel disabled or file path not configured' };
186
+ }
187
+ try {
188
+ // Ensure directory exists
189
+ const dir = path.dirname(this.filePath);
190
+ if (!fs.existsSync(dir)) {
191
+ fs.mkdirSync(dir, { recursive: true });
192
+ }
193
+ const entry = this.formatEntry(payload);
194
+ fs.appendFileSync(this.filePath, entry + '\n', 'utf-8');
195
+ return { success: true, channel: this.name };
196
+ }
197
+ catch (error) {
198
+ return {
199
+ success: false,
200
+ channel: this.name,
201
+ error: error instanceof Error ? error.message : 'Unknown error',
202
+ };
203
+ }
204
+ }
205
+ formatEntry(payload) {
206
+ const timestamp = (payload.timestamp ?? new Date()).toISOString();
207
+ return JSON.stringify({
208
+ timestamp,
209
+ type: payload.type,
210
+ kgprId: payload.kgprId,
211
+ title: payload.title,
212
+ message: payload.message,
213
+ authorId: payload.authorId,
214
+ authorName: payload.authorName,
215
+ metadata: payload.metadata,
216
+ });
217
+ }
218
+ }
219
+ /**
220
+ * Notification Service
221
+ *
222
+ * Multi-channel notification system for KGPR events
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * const service = new NotificationService({
227
+ * webhookUrl: 'https://example.com/webhook',
228
+ * cliEnabled: true,
229
+ * filePath: './notifications.log',
230
+ * });
231
+ *
232
+ * await service.notify({
233
+ * type: 'KGPR_SUBMITTED',
234
+ * kgprId: 'KGPR-20260106-001',
235
+ * title: 'Add user authentication',
236
+ * });
237
+ * ```
238
+ */
239
+ export class NotificationService extends EventEmitter {
240
+ channels = new Map();
241
+ constructor(config = {}) {
242
+ super();
243
+ // Initialize CLI channel
244
+ if (config.cliEnabled !== false) {
245
+ this.addChannel(new CLINotificationChannel({
246
+ enabled: config.cliEnabled ?? true,
247
+ stream: config.cliStream,
248
+ colored: config.cliColored ?? true,
249
+ }));
250
+ }
251
+ // Initialize Webhook channel
252
+ if (config.webhookUrl) {
253
+ this.addChannel(new WebhookNotificationChannel({
254
+ url: config.webhookUrl,
255
+ headers: config.webhookHeaders,
256
+ }));
257
+ }
258
+ // Initialize File channel
259
+ if (config.filePath) {
260
+ this.addChannel(new FileNotificationChannel({
261
+ filePath: config.filePath,
262
+ }));
263
+ }
264
+ }
265
+ /**
266
+ * Add a notification channel
267
+ */
268
+ addChannel(channel) {
269
+ this.channels.set(channel.name, channel);
270
+ }
271
+ /**
272
+ * Remove a notification channel
273
+ */
274
+ removeChannel(name) {
275
+ return this.channels.delete(name);
276
+ }
277
+ /**
278
+ * Get a notification channel by name
279
+ */
280
+ getChannel(name) {
281
+ return this.channels.get(name);
282
+ }
283
+ /**
284
+ * List all registered channels
285
+ */
286
+ listChannels() {
287
+ return Array.from(this.channels.values());
288
+ }
289
+ /**
290
+ * Send notification to all enabled channels
291
+ */
292
+ async notify(payload) {
293
+ const results = [];
294
+ const enabledChannels = Array.from(this.channels.values()).filter((ch) => ch.isEnabled());
295
+ if (enabledChannels.length === 0) {
296
+ return results;
297
+ }
298
+ // Ensure timestamp
299
+ const payloadWithTimestamp = {
300
+ ...payload,
301
+ timestamp: payload.timestamp ?? new Date(),
302
+ };
303
+ // Send to all channels in parallel
304
+ const promises = enabledChannels.map(async (channel) => {
305
+ try {
306
+ return await channel.send(payloadWithTimestamp);
307
+ }
308
+ catch (error) {
309
+ return {
310
+ success: false,
311
+ channel: channel.name,
312
+ error: error instanceof Error ? error.message : 'Unknown error',
313
+ };
314
+ }
315
+ });
316
+ const allResults = await Promise.all(promises);
317
+ results.push(...allResults);
318
+ // Emit events
319
+ const failures = results.filter((r) => !r.success);
320
+ if (failures.length > 0) {
321
+ this.emit('notification:failed', { payload: payloadWithTimestamp, errors: failures });
322
+ }
323
+ const successes = results.filter((r) => r.success);
324
+ if (successes.length > 0) {
325
+ this.emit('notification:sent', { payload: payloadWithTimestamp, results: successes });
326
+ }
327
+ return results;
328
+ }
329
+ /**
330
+ * Send notification to specific channel only
331
+ */
332
+ async notifyChannel(channelName, payload) {
333
+ const channel = this.channels.get(channelName);
334
+ if (!channel) {
335
+ return {
336
+ success: false,
337
+ channel: channelName,
338
+ error: `Channel '${channelName}' not found`,
339
+ };
340
+ }
341
+ if (!channel.isEnabled()) {
342
+ return {
343
+ success: false,
344
+ channel: channelName,
345
+ error: `Channel '${channelName}' is disabled`,
346
+ };
347
+ }
348
+ const payloadWithTimestamp = {
349
+ ...payload,
350
+ timestamp: payload.timestamp ?? new Date(),
351
+ };
352
+ return channel.send(payloadWithTimestamp);
353
+ }
354
+ // ============================================================================
355
+ // Convenience methods for specific events
356
+ // ============================================================================
357
+ /**
358
+ * Notify KGPR created
359
+ */
360
+ async notifyCreated(kgprId, title, authorName) {
361
+ return this.notify({
362
+ type: 'KGPR_CREATED',
363
+ kgprId,
364
+ title,
365
+ authorName,
366
+ message: `New KGPR created: ${title}`,
367
+ });
368
+ }
369
+ /**
370
+ * Notify KGPR submitted
371
+ */
372
+ async notifySubmitted(kgprId, title, authorName) {
373
+ return this.notify({
374
+ type: 'KGPR_SUBMITTED',
375
+ kgprId,
376
+ title,
377
+ authorName,
378
+ message: `KGPR submitted for review: ${title}`,
379
+ });
380
+ }
381
+ /**
382
+ * Notify KGPR approved
383
+ */
384
+ async notifyApproved(kgprId, title, reviewerName) {
385
+ return this.notify({
386
+ type: 'KGPR_APPROVED',
387
+ kgprId,
388
+ title,
389
+ authorName: reviewerName,
390
+ message: `KGPR approved by ${reviewerName ?? 'reviewer'}`,
391
+ });
392
+ }
393
+ /**
394
+ * Notify changes requested
395
+ */
396
+ async notifyChangesRequested(kgprId, title, reviewerName, comment) {
397
+ return this.notify({
398
+ type: 'KGPR_CHANGES_REQUESTED',
399
+ kgprId,
400
+ title,
401
+ authorName: reviewerName,
402
+ message: comment ?? `Changes requested by ${reviewerName ?? 'reviewer'}`,
403
+ });
404
+ }
405
+ /**
406
+ * Notify KGPR merged
407
+ */
408
+ async notifyMerged(kgprId, title) {
409
+ return this.notify({
410
+ type: 'KGPR_MERGED',
411
+ kgprId,
412
+ title,
413
+ message: `KGPR merged successfully`,
414
+ });
415
+ }
416
+ /**
417
+ * Notify KGPR closed
418
+ */
419
+ async notifyClosed(kgprId, title, reason) {
420
+ return this.notify({
421
+ type: 'KGPR_CLOSED',
422
+ kgprId,
423
+ title,
424
+ message: reason ?? `KGPR closed`,
425
+ });
426
+ }
427
+ /**
428
+ * Notify new comment
429
+ */
430
+ async notifyCommented(kgprId, title, commenterName, comment) {
431
+ return this.notify({
432
+ type: 'KGPR_COMMENTED',
433
+ kgprId,
434
+ title,
435
+ authorName: commenterName,
436
+ message: `${commenterName}: ${comment.substring(0, 100)}${comment.length > 100 ? '...' : ''}`,
437
+ });
438
+ }
439
+ }
440
+ //# sourceMappingURL=notification-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service.js","sourceRoot":"","sources":["../../src/kgpr/notification-service.ts"],"names":[],"mappings":"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"}