@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.
- package/dist/api-client.d.ts +71 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +165 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cache-manager.d.ts +122 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +376 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/index.d.ts +138 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +548 -0
- package/dist/index.js.map +1 -0
- package/dist/kgpr/index.d.ts +12 -0
- package/dist/kgpr/index.d.ts.map +1 -0
- package/dist/kgpr/index.js +12 -0
- package/dist/kgpr/index.js.map +1 -0
- package/dist/kgpr/kgpr-manager.d.ts +162 -0
- package/dist/kgpr/kgpr-manager.d.ts.map +1 -0
- package/dist/kgpr/kgpr-manager.js +465 -0
- package/dist/kgpr/kgpr-manager.js.map +1 -0
- package/dist/kgpr/merge-engine.d.ts +269 -0
- package/dist/kgpr/merge-engine.d.ts.map +1 -0
- package/dist/kgpr/merge-engine.js +451 -0
- package/dist/kgpr/merge-engine.js.map +1 -0
- package/dist/kgpr/notification-service.d.ts +227 -0
- package/dist/kgpr/notification-service.d.ts.map +1 -0
- package/dist/kgpr/notification-service.js +440 -0
- package/dist/kgpr/notification-service.js.map +1 -0
- package/dist/kgpr/privacy-filter.d.ts +61 -0
- package/dist/kgpr/privacy-filter.d.ts.map +1 -0
- package/dist/kgpr/privacy-filter.js +191 -0
- package/dist/kgpr/privacy-filter.js.map +1 -0
- package/dist/kgpr/types.d.ts +303 -0
- package/dist/kgpr/types.d.ts.map +1 -0
- package/dist/kgpr/types.js +40 -0
- package/dist/kgpr/types.js.map +1 -0
- package/dist/sync-engine.d.ts +104 -0
- package/dist/sync-engine.d.ts.map +1 -0
- package/dist/sync-engine.js +275 -0
- package/dist/sync-engine.js.map +1 -0
- package/dist/types.d.ts +353 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- 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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"}
|