pi-harness-runtime 1.1.147 → 1.1.148
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/CHANGELOG.md +2 -0
- package/package.json +3 -2
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/dist/src/extension.js +186 -0
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/dist/adapters/email-adapter.d.ts +17 -0
- package/packages/notification/dist/adapters/email-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/email-adapter.js +89 -0
- package/packages/notification/dist/adapters/email-adapter.js.map +1 -0
- package/packages/notification/dist/adapters/line-adapter.d.ts +17 -0
- package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/line-adapter.js +99 -0
- package/packages/notification/dist/adapters/line-adapter.js.map +1 -0
- package/packages/notification/dist/adapters/ntfy-adapter.d.ts +17 -0
- package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/ntfy-adapter.js +84 -0
- package/packages/notification/dist/adapters/ntfy-adapter.js.map +1 -0
- package/packages/notification/dist/adapters/telegram-adapter.d.ts +56 -0
- package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/telegram-adapter.js +251 -0
- package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -0
- package/packages/notification/dist/adapters/webhook-adapter.d.ts +15 -0
- package/packages/notification/dist/adapters/webhook-adapter.d.ts.map +1 -0
- package/packages/notification/dist/adapters/webhook-adapter.js +64 -0
- package/packages/notification/dist/adapters/webhook-adapter.js.map +1 -0
- package/packages/notification/dist/base-adapter.d.ts +36 -0
- package/packages/notification/dist/base-adapter.d.ts.map +1 -0
- package/packages/notification/dist/base-adapter.js +39 -0
- package/packages/notification/dist/base-adapter.js.map +1 -0
- package/packages/notification/dist/index.d.ts +12 -0
- package/packages/notification/dist/index.d.ts.map +1 -0
- package/packages/notification/dist/index.js +12 -0
- package/packages/notification/dist/index.js.map +1 -0
- package/packages/notification/dist/notification-center.d.ts +89 -0
- package/packages/notification/dist/notification-center.d.ts.map +1 -0
- package/packages/notification/dist/notification-center.js +356 -0
- package/packages/notification/dist/notification-center.js.map +1 -0
- package/packages/notification/dist/notification-policy.d.ts +66 -0
- package/packages/notification/dist/notification-policy.d.ts.map +1 -0
- package/packages/notification/dist/notification-policy.js +153 -0
- package/packages/notification/dist/notification-policy.js.map +1 -0
- package/packages/notification/dist/telegram-webhook-handler.d.ts +86 -0
- package/packages/notification/dist/telegram-webhook-handler.d.ts.map +1 -0
- package/packages/notification/dist/telegram-webhook-handler.js +149 -0
- package/packages/notification/dist/telegram-webhook-handler.js.map +1 -0
- package/packages/notification/dist/types.d.ts +106 -0
- package/packages/notification/dist/types.d.ts.map +1 -0
- package/packages/notification/dist/types.js +7 -0
- package/packages/notification/dist/types.js.map +1 -0
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Adapter — RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications via Telegram Bot API.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
7
|
+
export class TelegramAdapter extends BaseChannelAdapter {
|
|
8
|
+
id = "telegram";
|
|
9
|
+
type = "telegram";
|
|
10
|
+
_botUsername;
|
|
11
|
+
_callbackHandler;
|
|
12
|
+
_webhookSecret;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
super({ id: "telegram", type: "telegram", enabled: true, config });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register a callback handler for inline keyboard button clicks
|
|
18
|
+
*/
|
|
19
|
+
setCallbackHandler(handler) {
|
|
20
|
+
this._callbackHandler = handler;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Set webhook secret for verification
|
|
24
|
+
*/
|
|
25
|
+
setWebhookSecret(secret) {
|
|
26
|
+
this._webhookSecret = secret;
|
|
27
|
+
}
|
|
28
|
+
get botUsername() {
|
|
29
|
+
return this._botUsername;
|
|
30
|
+
}
|
|
31
|
+
async initialize() {
|
|
32
|
+
try {
|
|
33
|
+
const cfg = this.config.config;
|
|
34
|
+
const response = await fetch(`https://api.telegram.org/bot${cfg.botToken}/getMe`);
|
|
35
|
+
if (!response.ok)
|
|
36
|
+
return false;
|
|
37
|
+
const data = (await response.json());
|
|
38
|
+
if (data.ok && data.result?.username) {
|
|
39
|
+
this._botUsername = data.result.username;
|
|
40
|
+
}
|
|
41
|
+
return data.ok;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Send a message with optional inline keyboard buttons
|
|
49
|
+
*/
|
|
50
|
+
async send(payload) {
|
|
51
|
+
try {
|
|
52
|
+
const cfg = this.config.config;
|
|
53
|
+
const message = this.formatMessage(payload);
|
|
54
|
+
// Build request body
|
|
55
|
+
const body = {
|
|
56
|
+
chat_id: cfg.chatId,
|
|
57
|
+
text: message,
|
|
58
|
+
parse_mode: cfg.parseMode ?? "MarkdownV2",
|
|
59
|
+
};
|
|
60
|
+
// Add inline keyboard if enabled and buttons are configured
|
|
61
|
+
if (cfg.enableInlineKeyboard && (cfg.actionButtons?.length ?? 0) > 0) {
|
|
62
|
+
body.reply_markup = this.buildInlineKeyboard(cfg.actionButtons);
|
|
63
|
+
}
|
|
64
|
+
const response = await fetch(`https://api.telegram.org/bot${cfg.botToken}/sendMessage`, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: { "Content-Type": "application/json" },
|
|
67
|
+
body: JSON.stringify(body),
|
|
68
|
+
});
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
const error = await response.text();
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
channel: this.id,
|
|
74
|
+
error: `Telegram API error: ${error}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return { success: true, channel: this.id };
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
channel: this.id,
|
|
83
|
+
error: String(error),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Build inline keyboard markup from button configuration
|
|
89
|
+
*/
|
|
90
|
+
buildInlineKeyboard(buttons) {
|
|
91
|
+
// Group buttons into rows of up to 3 buttons each (Telegram limit)
|
|
92
|
+
const ROW_SIZE = 3;
|
|
93
|
+
const rows = [];
|
|
94
|
+
for (let i = 0; i < buttons.length; i += ROW_SIZE) {
|
|
95
|
+
const row = buttons.slice(i, i + ROW_SIZE).map((btn) => ({
|
|
96
|
+
text: btn.text,
|
|
97
|
+
...(btn.url ? { url: btn.url } : { callback_data: btn.callbackData }),
|
|
98
|
+
}));
|
|
99
|
+
rows.push(row);
|
|
100
|
+
}
|
|
101
|
+
return { inline_keyboard: rows };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Process incoming webhook update from Telegram
|
|
105
|
+
*/
|
|
106
|
+
async handleWebhookUpdate(update) {
|
|
107
|
+
// Verify secret token if set
|
|
108
|
+
if (this._webhookSecret) {
|
|
109
|
+
const secretToken = update.secret_token;
|
|
110
|
+
if (secretToken !== this._webhookSecret) {
|
|
111
|
+
console.error("[TelegramAdapter] Invalid webhook secret");
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Handle callback query (button click)
|
|
116
|
+
const callbackQuery = update.callback_query;
|
|
117
|
+
if (callbackQuery && this._callbackHandler) {
|
|
118
|
+
const query = this.parseCallbackQuery(callbackQuery);
|
|
119
|
+
if (query) {
|
|
120
|
+
await this._callbackHandler(query.data, query);
|
|
121
|
+
await this.answerCallbackQuery(query.id);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Handle regular messages (future: user can type commands)
|
|
125
|
+
const message = update.message;
|
|
126
|
+
if (message) {
|
|
127
|
+
console.log("[TelegramAdapter] Received message:", message.text);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Parse callback query from webhook update
|
|
132
|
+
*/
|
|
133
|
+
parseCallbackQuery(raw) {
|
|
134
|
+
try {
|
|
135
|
+
const from = raw.from;
|
|
136
|
+
const message = raw.message;
|
|
137
|
+
const chat = message?.chat;
|
|
138
|
+
return {
|
|
139
|
+
id: String(raw.id),
|
|
140
|
+
from: {
|
|
141
|
+
id: Number(from?.id),
|
|
142
|
+
is_bot: Boolean(from?.is_bot),
|
|
143
|
+
first_name: String(from?.first_name ?? ""),
|
|
144
|
+
username: from?.username ? String(from.username) : undefined,
|
|
145
|
+
},
|
|
146
|
+
chat_instance: String(raw.chat_instance ?? ""),
|
|
147
|
+
data: String(raw.data ?? ""),
|
|
148
|
+
message: message
|
|
149
|
+
? {
|
|
150
|
+
chat: { id: Number(chat?.id) },
|
|
151
|
+
message_id: Number(message?.message_id),
|
|
152
|
+
}
|
|
153
|
+
: undefined,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
console.error("[TelegramAdapter] Failed to parse callback query");
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Answer a callback query to remove loading state
|
|
163
|
+
*/
|
|
164
|
+
async answerCallbackQuery(callbackQueryId) {
|
|
165
|
+
try {
|
|
166
|
+
const cfg = this.config.config;
|
|
167
|
+
await fetch(`https://api.telegram.org/bot${cfg.botToken}/answerCallbackQuery`, {
|
|
168
|
+
method: "POST",
|
|
169
|
+
headers: { "Content-Type": "application/json" },
|
|
170
|
+
body: JSON.stringify({ callback_query_id: callbackQueryId }),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
console.error("[TelegramAdapter] Failed to answer callback query:", error);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Setup webhook for receiving updates
|
|
179
|
+
*/
|
|
180
|
+
async setupWebhook(webhookUrl) {
|
|
181
|
+
try {
|
|
182
|
+
const cfg = this.config.config;
|
|
183
|
+
const response = await fetch(`https://api.telegram.org/bot${cfg.botToken}/setWebhook`, {
|
|
184
|
+
method: "POST",
|
|
185
|
+
headers: { "Content-Type": "application/json" },
|
|
186
|
+
body: JSON.stringify({
|
|
187
|
+
url: webhookUrl,
|
|
188
|
+
secret_token: this._webhookSecret,
|
|
189
|
+
}),
|
|
190
|
+
});
|
|
191
|
+
if (!response.ok) {
|
|
192
|
+
console.error("[TelegramAdapter] Webhook setup failed:", await response.text());
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
console.log(`[TelegramAdapter] Webhook set to: ${webhookUrl}`);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error("[TelegramAdapter] Webhook setup error:", error);
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get current webhook info
|
|
205
|
+
*/
|
|
206
|
+
async getWebhookInfo() {
|
|
207
|
+
try {
|
|
208
|
+
const cfg = this.config.config;
|
|
209
|
+
const response = await fetch(`https://api.telegram.org/bot${cfg.botToken}/getWebhookInfo`);
|
|
210
|
+
if (!response.ok)
|
|
211
|
+
return null;
|
|
212
|
+
return (await response.json());
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
formatMessage(payload) {
|
|
219
|
+
const emoji = this.getEmoji(payload.event);
|
|
220
|
+
const title = `${emoji} ${payload.title}`;
|
|
221
|
+
const lines = [title, "", payload.message];
|
|
222
|
+
if (payload.details?.taskTitle) {
|
|
223
|
+
lines.push("", `Task: ${payload.details.taskTitle}`);
|
|
224
|
+
}
|
|
225
|
+
if (payload.details?.jobId) {
|
|
226
|
+
lines.push(`Job: ${payload.details.jobId}`);
|
|
227
|
+
}
|
|
228
|
+
if (payload.details?.error) {
|
|
229
|
+
lines.push("", `Error: ${payload.details.error}`);
|
|
230
|
+
}
|
|
231
|
+
return lines.filter(Boolean).join("\n");
|
|
232
|
+
}
|
|
233
|
+
getEmoji(event) {
|
|
234
|
+
const map = {
|
|
235
|
+
JobStarted: "🚀",
|
|
236
|
+
TaskCompleted: "✅",
|
|
237
|
+
TaskFailed: "❌",
|
|
238
|
+
QuotaPaused: "⏸️",
|
|
239
|
+
ResumeScheduled: "▶️",
|
|
240
|
+
ContextCompacted: "📦",
|
|
241
|
+
OutputLimitContinued: "🔄",
|
|
242
|
+
E2EFailed: "🧪",
|
|
243
|
+
HumanReviewNeeded: "👤",
|
|
244
|
+
ReadyForClient: "🎉",
|
|
245
|
+
JobCancelled: "🚫",
|
|
246
|
+
Error: "⚠️",
|
|
247
|
+
};
|
|
248
|
+
return map[event] ?? "📢";
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=telegram-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-adapter.js","sourceRoot":"","sources":["../../src/adapters/telegram-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,OAAO,eAAgB,SAAQ,kBAAkB;IAC9C,EAAE,GAAG,UAAU,CAAC;IAChB,IAAI,GAAG,UAAU,CAAC;IACnB,YAAY,CAAqB;IACjC,gBAAgB,CAAsC;IACtD,cAAc,CAAqB;IAE3C,YAAY,MAAsB;QAClC,KAAK,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAgC;QAClD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAc;QAC9B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,IAAI,WAAW;QACf,OAAO,IAAI,CAAC,YAAY,CAAC;IACzB,CAAC;IAEA,KAAK,CAAC,UAAU;QACf,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAwB,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC3B,+BAA+B,GAAG,CAAC,QAAQ,QAAQ,CACnD,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoD,CAAC;YACxF,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC1C,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAA4B;QACtC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAwB,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE5C,qBAAqB;YACrB,MAAM,IAAI,GAA4B;gBACrC,OAAO,EAAE,GAAG,CAAC,MAAM;gBACnB,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,YAAY;aACzC,CAAC;YAEF,4DAA4D;YAC5D,IAAI,GAAG,CAAC,oBAAoB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAc,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC3B,+BAA+B,GAAG,CAAC,QAAQ,cAAc,EACzD;gBACC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC1B,CACD,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,OAAO;oBACN,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,IAAI,CAAC,EAAE;oBAChB,KAAK,EAAE,uBAAuB,KAAK,EAAE;iBACrC,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACpB,CAAC;QACH,CAAC;IACF,CAAC;IAED;;OAEG;IACK,mBAAmB,CAC1B,OAA+B;QAE/B,mEAAmE;QACnE,MAAM,QAAQ,GAAG,CAAC,CAAC;QACnB,MAAM,IAAI,GAAyE,EAAE,CAAC;QAEtF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACxD,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;aACrE,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QAED,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,MAA+B;QACxD,6BAA6B;QAC7B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,WAAW,GAAI,MAAoC,CAAC,YAAY,CAAC;YACvE,IAAI,WAAW,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC1D,OAAO;YACR,CAAC;QACF,CAAC;QAED,uCAAuC;QACvC,MAAM,aAAa,GAAG,MAAM,CAAC,cAAqD,CAAC;QACnF,IAAI,aAAa,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC/C,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1C,CAAC;QACF,CAAC;QAED,2DAA2D;QAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,OAA8C,CAAC;QACtE,IAAI,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC;IACF,CAAC;IAED;;OAEG;IACK,kBAAkB,CACzB,GAA4B;QAE5B,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,GAAG,CAAC,IAA+B,CAAC;YACjD,MAAM,OAAO,GAAG,GAAG,CAAC,OAA8C,CAAC;YACnE,MAAM,IAAI,GAAG,OAAO,EAAE,IAA2C,CAAC;YAElE,OAAO;gBACN,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,IAAI,EAAE;oBACL,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBACpB,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;oBAC7B,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC;oBAC1C,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC5D;gBACD,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;gBAC9C,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC5B,OAAO,EAAE,OAAO;oBACf,CAAC,CAAC;wBACA,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;wBAC9B,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;qBACvC;oBACF,CAAC,CAAC,SAAS;aACZ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,eAAuB;QACxD,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAwB,CAAC;YACjD,MAAM,KAAK,CACV,+BAA+B,GAAG,CAAC,QAAQ,sBAAsB,EACjE;gBACC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;aAC5D,CACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB;QACpC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAwB,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC3B,+BAA+B,GAAG,CAAC,QAAQ,aAAa,EACxD;gBACC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACpB,GAAG,EAAE,UAAU;oBACf,YAAY,EAAE,IAAI,CAAC,cAAc;iBACjC,CAAC;aACF,CACD,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChF,OAAO,KAAK,CAAC;YACd,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;YAC/D,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QACnB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAwB,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC3B,+BAA+B,GAAG,CAAC,QAAQ,iBAAiB,CAC5D,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YAC9B,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAEO,aAAa,CAAC,OAA4B;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,GAAG,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,QAAQ,CAAC,KAAmC;QACnD,MAAM,GAAG,GAA2B;YACnC,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,GAAG;YAClB,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE,IAAI;YACrB,gBAAgB,EAAE,IAAI;YACtB,oBAAoB,EAAE,IAAI;YAC1B,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,IAAI;YACpB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,IAAI;SACX,CAAC;QACF,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC3B,CAAC;CACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook Adapter — RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications to a generic webhook endpoint.
|
|
5
|
+
*/
|
|
6
|
+
import type { NotificationPayload, NotificationResult, WebhookConfig } from "../types.js";
|
|
7
|
+
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
8
|
+
export declare class WebhookAdapter extends BaseChannelAdapter {
|
|
9
|
+
readonly id = "webhook";
|
|
10
|
+
readonly type = "webhook";
|
|
11
|
+
constructor(config: WebhookConfig);
|
|
12
|
+
initialize(): Promise<boolean>;
|
|
13
|
+
send(payload: NotificationPayload): Promise<NotificationResult>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=webhook-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/webhook-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,qBAAa,cAAe,SAAQ,kBAAkB;IACrD,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,aAAa;IAE1B,YAAY,MAAM,EAAE,aAAa,EAEhC;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAOnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2CpE;CACD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook Adapter — RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Sends notifications to a generic webhook endpoint.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseChannelAdapter } from "../base-adapter.js";
|
|
7
|
+
export class WebhookAdapter extends BaseChannelAdapter {
|
|
8
|
+
id = "webhook";
|
|
9
|
+
type = "webhook";
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super({ id: "webhook", type: "webhook", enabled: true, config });
|
|
12
|
+
}
|
|
13
|
+
async initialize() {
|
|
14
|
+
try {
|
|
15
|
+
const cfg = this.config.config;
|
|
16
|
+
return Boolean(cfg.url && cfg.url.startsWith("http"));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async send(payload) {
|
|
23
|
+
try {
|
|
24
|
+
const cfg = this.config.config;
|
|
25
|
+
const headers = {
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
...(cfg.headers ?? {}),
|
|
28
|
+
};
|
|
29
|
+
// Add auth token if configured
|
|
30
|
+
if (cfg.authToken) {
|
|
31
|
+
headers["Authorization"] = `Bearer ${cfg.authToken}`;
|
|
32
|
+
}
|
|
33
|
+
const response = await fetch(cfg.url, {
|
|
34
|
+
method: cfg.method ?? "POST",
|
|
35
|
+
headers,
|
|
36
|
+
body: JSON.stringify({
|
|
37
|
+
event: payload.event,
|
|
38
|
+
jobId: payload.jobId,
|
|
39
|
+
timestamp: payload.timestamp,
|
|
40
|
+
title: payload.title,
|
|
41
|
+
message: payload.message,
|
|
42
|
+
details: payload.details,
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
const error = await response.text();
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
channel: this.id,
|
|
50
|
+
error: `Webhook error ${response.status}: ${error}`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return { success: true, channel: this.id };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
channel: this.id,
|
|
59
|
+
error: String(error),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=webhook-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-adapter.js","sourceRoot":"","sources":["../../src/adapters/webhook-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IAC5C,EAAE,GAAG,SAAS,CAAC;IACf,IAAI,GAAG,SAAS,CAAC;IAE1B,YAAY,MAAqB;QAChC,KAAK,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,UAAU;QACf,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAuB,CAAC;YAChD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA4B;QACtC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAuB,CAAC;YAChD,MAAM,OAAO,GAA2B;gBACvC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aACtB,CAAC;YAEF,+BAA+B;YAC/B,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACnB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,GAAG,CAAC,SAAS,EAAE,CAAC;YACtD,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACrC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM;gBAC5B,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;iBACxB,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,OAAO;oBACN,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,IAAI,CAAC,EAAE;oBAChB,KAAK,EAAE,iBAAiB,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE;iBACnD,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACpB,CAAC;QACH,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Base Adapter — RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for all notification channel adapters.
|
|
5
|
+
*/
|
|
6
|
+
import type { NotificationPayload, NotificationChannelConfig, NotificationResult } from "./types.js";
|
|
7
|
+
export interface ChannelAdapter {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly type: string;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize the adapter (e.g., verify credentials)
|
|
12
|
+
*/
|
|
13
|
+
initialize(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Send a notification
|
|
16
|
+
*/
|
|
17
|
+
send(payload: NotificationPayload): Promise<NotificationResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if the adapter is properly configured
|
|
20
|
+
*/
|
|
21
|
+
isConfigured(): boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare abstract class BaseChannelAdapter implements ChannelAdapter {
|
|
24
|
+
protected config: NotificationChannelConfig;
|
|
25
|
+
abstract readonly id: string;
|
|
26
|
+
abstract readonly type: string;
|
|
27
|
+
constructor(config: NotificationChannelConfig);
|
|
28
|
+
abstract initialize(): Promise<boolean>;
|
|
29
|
+
abstract send(payload: NotificationPayload): Promise<NotificationResult>;
|
|
30
|
+
isConfigured(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Redact sensitive data from payload before sending
|
|
33
|
+
*/
|
|
34
|
+
protected redact(payload: NotificationPayload, patterns: RegExp[]): NotificationPayload;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=base-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../src/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEhE;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC;CACxB;AAED,8BAAsB,kBAAmB,YAAW,cAAc;IAIrD,SAAS,CAAC,MAAM,EAAE,yBAAyB;IAHvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B,YAAsB,MAAM,EAAE,yBAAyB,EAAI;IAE3D,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEzE,YAAY,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,SAAS,CAAC,MAAM,CACf,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,EAAE,GAChB,mBAAmB,CAsBrB;CACD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Base Adapter — RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for all notification channel adapters.
|
|
5
|
+
*/
|
|
6
|
+
export class BaseChannelAdapter {
|
|
7
|
+
config;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
isConfigured() {
|
|
12
|
+
return this.config.enabled;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Redact sensitive data from payload before sending
|
|
16
|
+
*/
|
|
17
|
+
redact(payload, patterns) {
|
|
18
|
+
if (patterns.length === 0)
|
|
19
|
+
return payload;
|
|
20
|
+
const redacted = [];
|
|
21
|
+
const details = payload.details ? { ...payload.details } : {};
|
|
22
|
+
for (const [key, value] of Object.entries(details)) {
|
|
23
|
+
const valStr = String(value);
|
|
24
|
+
for (const pattern of patterns) {
|
|
25
|
+
if (pattern.test(valStr)) {
|
|
26
|
+
redacted.push(key);
|
|
27
|
+
details[key] = "[REDACTED]";
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
...payload,
|
|
34
|
+
details,
|
|
35
|
+
redacted: redacted.length > 0 ? redacted : undefined,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=base-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../src/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4BH,MAAM,OAAgB,kBAAkB;IAIjB,MAAM;IAA5B,YAAsB,MAAiC;sBAAjC,MAAM;IAA8B,CAAC;IAK3D,YAAY;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED;;OAEG;IACO,MAAM,CACf,OAA4B,EAC5B,QAAkB;QAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAE1C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE9D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAClB,OAAmC,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;oBACzD,MAAM;gBACP,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO;YACN,GAAG,OAAO;YACV,OAAO;YACP,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACpD,CAAC;IACH,CAAC;CACD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Center (RFC-0029)
|
|
3
|
+
*
|
|
4
|
+
* Unified notification system for the harness runtime.
|
|
5
|
+
*/
|
|
6
|
+
export * from "./notification-center.js";
|
|
7
|
+
export * from "./base-adapter.js";
|
|
8
|
+
export * from "./types.js";
|
|
9
|
+
export * from "./telegram-webhook-handler.js";
|
|
10
|
+
export { LineAdapter } from "./adapters/line-adapter.js";
|
|
11
|
+
export { TelegramAdapter } from "./adapters/telegram-adapter.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Center (RFC-0029)
|
|
3
|
+
*
|
|
4
|
+
* Unified notification system for the harness runtime.
|
|
5
|
+
*/
|
|
6
|
+
export * from "./notification-center.js";
|
|
7
|
+
export * from "./base-adapter.js";
|
|
8
|
+
export * from "./types.js";
|
|
9
|
+
export * from "./telegram-webhook-handler.js";
|
|
10
|
+
export { LineAdapter } from "./adapters/line-adapter.js";
|
|
11
|
+
export { TelegramAdapter } from "./adapters/telegram-adapter.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Center — RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Main orchestration class for sending notifications across multiple channels.
|
|
5
|
+
*
|
|
6
|
+
* Security Rules (RFC-0022):
|
|
7
|
+
* - Do not send raw cookies, passwords, provider tokens
|
|
8
|
+
* - Redact sensitive data before sending
|
|
9
|
+
* - Notification failure does not crash runtime
|
|
10
|
+
*/
|
|
11
|
+
import type { NotificationEvent, NotificationConfig, NotificationChannelConfig, NotificationResult, NotificationContext, TelegramCallbackHandler } from "./types.js";
|
|
12
|
+
import { TelegramAdapter } from "./adapters/telegram-adapter.js";
|
|
13
|
+
export declare class NotificationCenter {
|
|
14
|
+
private adapters;
|
|
15
|
+
private redactPatterns;
|
|
16
|
+
constructor(config?: NotificationConfig);
|
|
17
|
+
/**
|
|
18
|
+
* Register a new adapter
|
|
19
|
+
*/
|
|
20
|
+
registerAdapter(config: NotificationChannelConfig): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Initialize all registered adapters
|
|
23
|
+
*/
|
|
24
|
+
initialize(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Send a notification to all configured channels
|
|
27
|
+
*/
|
|
28
|
+
notify(event: NotificationEvent, context: NotificationContext): Promise<NotificationResult[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Send notification to a specific channel
|
|
31
|
+
*/
|
|
32
|
+
notifyChannel(channelId: string, event: NotificationEvent, context: NotificationContext): Promise<NotificationResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if any notifications are configured
|
|
35
|
+
*/
|
|
36
|
+
hasChannels(): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* List all configured channels
|
|
39
|
+
*/
|
|
40
|
+
listChannels(): string[];
|
|
41
|
+
/**
|
|
42
|
+
* Get Telegram bot username if configured
|
|
43
|
+
*/
|
|
44
|
+
getTelegramBotUsername(): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Get Telegram adapter for advanced operations (webhook setup, etc.)
|
|
47
|
+
*/
|
|
48
|
+
getTelegramAdapter(): TelegramAdapter | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Set callback handler for Telegram inline keyboard button clicks
|
|
51
|
+
*/
|
|
52
|
+
setTelegramCallbackHandler(handler: TelegramCallbackHandler): void;
|
|
53
|
+
/**
|
|
54
|
+
* Set webhook secret for Telegram updates verification
|
|
55
|
+
*/
|
|
56
|
+
setTelegramWebhookSecret(secret: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Setup Telegram webhook for receiving updates
|
|
59
|
+
*/
|
|
60
|
+
setupTelegramWebhook(webhookUrl: string): Promise<boolean>;
|
|
61
|
+
/**
|
|
62
|
+
* Send notification with interactive Yes/No buttons
|
|
63
|
+
*/
|
|
64
|
+
notifyWithApproval(event: NotificationEvent, context: NotificationContext, options?: {
|
|
65
|
+
/** Custom button labels */
|
|
66
|
+
approveLabel?: string;
|
|
67
|
+
rejectLabel?: string;
|
|
68
|
+
/** Additional details for the message */
|
|
69
|
+
additionalDetails?: Record<string, unknown>;
|
|
70
|
+
}): Promise<NotificationResult[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Send interactive notification with custom buttons
|
|
73
|
+
*/
|
|
74
|
+
notifyWithButtons(event: NotificationEvent, context: NotificationContext, buttons: Array<{
|
|
75
|
+
text: string;
|
|
76
|
+
action: string;
|
|
77
|
+
targetId: string;
|
|
78
|
+
url?: string;
|
|
79
|
+
}>, options?: {
|
|
80
|
+
/** Additional details for the message */
|
|
81
|
+
additionalDetails?: Record<string, unknown>;
|
|
82
|
+
}): Promise<NotificationResult[]>;
|
|
83
|
+
private createAdapter;
|
|
84
|
+
private buildPayload;
|
|
85
|
+
private getEventContent;
|
|
86
|
+
private redact;
|
|
87
|
+
private getDefaultRedactPatterns;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=notification-center.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-center.d.ts","sourceRoot":"","sources":["../src/notification-center.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAEX,iBAAiB,EAEjB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EAEvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAOjE,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,cAAc,CAAW;IAEjC,YAAY,MAAM,CAAC,EAAE,kBAAkB,EAWtC;IAED;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAa1D;IAED;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBhC;IAED;;OAEG;IACG,MAAM,CACX,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwB/B;IAED;;OAEG;IACG,aAAa,CAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAY7B;IAED;;OAEG;IACH,WAAW,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE,CAEvB;IAED;;OAEG;IACH,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAM3C;IAED;;OAEG;IACH,kBAAkB,IAAI,eAAe,GAAG,SAAS,CAMhD;IAED;;OAEG;IACH,0BAA0B,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAKjE;IAED;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAK7C;IAED;;OAEG;IACG,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM/D;IAED;;OAEG;IACG,kBAAkB,CACvB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE;QACT,2BAA2B;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,yCAAyC;QACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,GACC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA8B/B;IAED;;OAEG;IACG,iBAAiB,CACtB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChF,OAAO,CAAC,EAAE;QACT,yCAAyC;QACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,GACC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA0B/B;IAID,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,eAAe;IA2EvB,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,wBAAwB;CAWhC"}
|