pi-harness-runtime 1.1.145 → 1.1.147
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -0
- package/index.ts +136 -6
- package/package.json +2 -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/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/src/adapters/email-adapter.d.ts.map +1 -0
- package/packages/notification/dist/src/adapters/email-adapter.js.map +1 -0
- package/packages/notification/dist/src/adapters/line-adapter.d.ts.map +1 -0
- package/packages/notification/dist/src/adapters/line-adapter.js.map +1 -0
- package/packages/notification/dist/src/adapters/ntfy-adapter.d.ts.map +1 -0
- package/packages/notification/dist/src/adapters/ntfy-adapter.js.map +1 -0
- package/packages/notification/dist/src/adapters/telegram-adapter.d.ts +56 -0
- package/packages/notification/dist/src/adapters/telegram-adapter.d.ts.map +1 -0
- package/packages/notification/dist/src/adapters/telegram-adapter.js +251 -0
- package/packages/notification/dist/src/adapters/telegram-adapter.js.map +1 -0
- package/packages/notification/dist/src/adapters/webhook-adapter.d.ts.map +1 -0
- package/packages/notification/dist/src/adapters/webhook-adapter.js.map +1 -0
- package/packages/notification/dist/src/base-adapter.d.ts.map +1 -0
- package/packages/notification/dist/src/base-adapter.js.map +1 -0
- package/packages/notification/dist/{index.d.ts → src/index.d.ts} +2 -0
- package/packages/notification/dist/src/index.d.ts.map +1 -0
- package/packages/notification/dist/{index.js → src/index.js} +2 -0
- package/packages/notification/dist/src/index.js.map +1 -0
- package/packages/notification/dist/src/notification-center.d.ts +89 -0
- package/packages/notification/dist/src/notification-center.d.ts.map +1 -0
- package/packages/notification/dist/{notification-center.js → src/notification-center.js} +103 -1
- package/packages/notification/dist/src/notification-center.js.map +1 -0
- package/packages/notification/dist/src/notification-policy.d.ts +66 -0
- package/packages/notification/dist/src/notification-policy.d.ts.map +1 -0
- package/packages/notification/dist/src/notification-policy.js +153 -0
- package/packages/notification/dist/src/notification-policy.js.map +1 -0
- package/packages/notification/dist/src/telegram-webhook-handler.d.ts +86 -0
- package/packages/notification/dist/src/telegram-webhook-handler.d.ts.map +1 -0
- package/packages/notification/dist/src/telegram-webhook-handler.js +149 -0
- package/packages/notification/dist/src/telegram-webhook-handler.js.map +1 -0
- package/packages/notification/dist/{types.d.ts → src/types.d.ts} +37 -0
- package/packages/notification/dist/src/types.d.ts.map +1 -0
- package/packages/notification/dist/src/types.js.map +1 -0
- package/packages/notification/package.json +1 -1
- package/packages/notification/src/adapters/telegram-adapter.ts +187 -5
- package/packages/notification/src/index.ts +2 -0
- package/packages/notification/src/notification-center.ts +139 -0
- package/packages/notification/src/notification-policy.ts +203 -0
- package/packages/notification/src/telegram-webhook-handler.ts +211 -0
- package/packages/notification/src/types.ts +42 -0
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/dist/index.d.ts.map +1 -1
- package/packages/paperclip-integration/dist/index.js +30 -18
- package/packages/paperclip-integration/dist/index.js.map +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/paperclip-integration/src/index.ts +35 -20
- 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
- package/scripts/telegram-callback-processor.ts +180 -0
- package/scripts/telegram-webhook-server.ts +387 -0
- package/scripts/test-telegram-approval.ts +64 -0
- package/packages/notification/dist/adapters/email-adapter.d.ts.map +0 -1
- package/packages/notification/dist/adapters/email-adapter.js.map +0 -1
- package/packages/notification/dist/adapters/line-adapter.d.ts.map +0 -1
- package/packages/notification/dist/adapters/line-adapter.js.map +0 -1
- package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +0 -1
- package/packages/notification/dist/adapters/ntfy-adapter.js.map +0 -1
- package/packages/notification/dist/adapters/telegram-adapter.d.ts +0 -19
- package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +0 -1
- package/packages/notification/dist/adapters/telegram-adapter.js +0 -97
- package/packages/notification/dist/adapters/telegram-adapter.js.map +0 -1
- package/packages/notification/dist/adapters/webhook-adapter.d.ts.map +0 -1
- package/packages/notification/dist/adapters/webhook-adapter.js.map +0 -1
- package/packages/notification/dist/base-adapter.d.ts.map +0 -1
- package/packages/notification/dist/base-adapter.js.map +0 -1
- package/packages/notification/dist/index.d.ts.map +0 -1
- package/packages/notification/dist/index.js.map +0 -1
- package/packages/notification/dist/notification-center.d.ts +0 -50
- package/packages/notification/dist/notification-center.d.ts.map +0 -1
- package/packages/notification/dist/notification-center.js.map +0 -1
- package/packages/notification/dist/types.d.ts.map +0 -1
- package/packages/notification/dist/types.js.map +0 -1
- /package/packages/notification/dist/{adapters → src/adapters}/email-adapter.d.ts +0 -0
- /package/packages/notification/dist/{adapters → src/adapters}/email-adapter.js +0 -0
- /package/packages/notification/dist/{adapters → src/adapters}/line-adapter.d.ts +0 -0
- /package/packages/notification/dist/{adapters → src/adapters}/line-adapter.js +0 -0
- /package/packages/notification/dist/{adapters → src/adapters}/ntfy-adapter.d.ts +0 -0
- /package/packages/notification/dist/{adapters → src/adapters}/ntfy-adapter.js +0 -0
- /package/packages/notification/dist/{adapters → src/adapters}/webhook-adapter.d.ts +0 -0
- /package/packages/notification/dist/{adapters → src/adapters}/webhook-adapter.js +0 -0
- /package/packages/notification/dist/{base-adapter.d.ts → src/base-adapter.d.ts} +0 -0
- /package/packages/notification/dist/{base-adapter.js → src/base-adapter.js} +0 -0
- /package/packages/notification/dist/{types.js → src/types.js} +0 -0
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - Notification failure does not crash runtime
|
|
10
10
|
*/
|
|
11
11
|
import { TelegramAdapter } from "./adapters/telegram-adapter.js";
|
|
12
|
+
import { buildCallbackData, CallbackActions } from "./telegram-webhook-handler.js";
|
|
12
13
|
import { LineAdapter } from "./adapters/line-adapter.js";
|
|
13
14
|
import { NtfyAdapter } from "./adapters/ntfy-adapter.js";
|
|
14
15
|
import { EmailAdapter } from "./adapters/email-adapter.js";
|
|
@@ -125,6 +126,103 @@ export class NotificationCenter {
|
|
|
125
126
|
}
|
|
126
127
|
return undefined;
|
|
127
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Get Telegram adapter for advanced operations (webhook setup, etc.)
|
|
131
|
+
*/
|
|
132
|
+
getTelegramAdapter() {
|
|
133
|
+
const adapter = this.adapters.get("telegram");
|
|
134
|
+
if (adapter instanceof TelegramAdapter) {
|
|
135
|
+
return adapter;
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Set callback handler for Telegram inline keyboard button clicks
|
|
141
|
+
*/
|
|
142
|
+
setTelegramCallbackHandler(handler) {
|
|
143
|
+
const adapter = this.adapters.get("telegram");
|
|
144
|
+
if (adapter instanceof TelegramAdapter) {
|
|
145
|
+
adapter.setCallbackHandler(handler);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Set webhook secret for Telegram updates verification
|
|
150
|
+
*/
|
|
151
|
+
setTelegramWebhookSecret(secret) {
|
|
152
|
+
const adapter = this.adapters.get("telegram");
|
|
153
|
+
if (adapter instanceof TelegramAdapter) {
|
|
154
|
+
adapter.setWebhookSecret(secret);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Setup Telegram webhook for receiving updates
|
|
159
|
+
*/
|
|
160
|
+
async setupTelegramWebhook(webhookUrl) {
|
|
161
|
+
const adapter = this.adapters.get("telegram");
|
|
162
|
+
if (adapter instanceof TelegramAdapter) {
|
|
163
|
+
return await adapter.setupWebhook(webhookUrl);
|
|
164
|
+
}
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Send notification with interactive Yes/No buttons
|
|
169
|
+
*/
|
|
170
|
+
async notifyWithApproval(event, context, options) {
|
|
171
|
+
const approveLabel = options?.approveLabel ?? "Yes";
|
|
172
|
+
const rejectLabel = options?.rejectLabel ?? "No";
|
|
173
|
+
// Build buttons
|
|
174
|
+
const buttons = [
|
|
175
|
+
{ text: `\u2705 ${approveLabel}`, callbackData: buildCallbackData(CallbackActions.APPROVE, context.jobId) },
|
|
176
|
+
{ text: `\u274C ${rejectLabel}`, callbackData: buildCallbackData(CallbackActions.REJECT, context.jobId) },
|
|
177
|
+
];
|
|
178
|
+
// Send to each channel with buttons (Telegram only)
|
|
179
|
+
const results = [];
|
|
180
|
+
for (const [id, adapter] of this.adapters.entries()) {
|
|
181
|
+
if (adapter instanceof TelegramAdapter) {
|
|
182
|
+
try {
|
|
183
|
+
const payload = this.buildPayload(event, context, {
|
|
184
|
+
enableInlineKeyboard: true,
|
|
185
|
+
actionButtons: buttons,
|
|
186
|
+
...(options?.additionalDetails && { additionalDetails: options.additionalDetails }),
|
|
187
|
+
});
|
|
188
|
+
const result = await adapter.send(payload);
|
|
189
|
+
results.push(result);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
results.push({ success: false, channel: id, error: String(error) });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return results;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Send interactive notification with custom buttons
|
|
200
|
+
*/
|
|
201
|
+
async notifyWithButtons(event, context, buttons, options) {
|
|
202
|
+
const results = [];
|
|
203
|
+
for (const [id, adapter] of this.adapters.entries()) {
|
|
204
|
+
if (adapter instanceof TelegramAdapter) {
|
|
205
|
+
try {
|
|
206
|
+
const formattedButtons = buttons.map((b) => ({
|
|
207
|
+
text: b.text,
|
|
208
|
+
callbackData: buildCallbackData(b.action, b.targetId),
|
|
209
|
+
url: b.url,
|
|
210
|
+
}));
|
|
211
|
+
const payload = this.buildPayload(event, context, {
|
|
212
|
+
enableInlineKeyboard: true,
|
|
213
|
+
actionButtons: formattedButtons,
|
|
214
|
+
...(options?.additionalDetails && { additionalDetails: options.additionalDetails }),
|
|
215
|
+
});
|
|
216
|
+
const result = await adapter.send(payload);
|
|
217
|
+
results.push(result);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
results.push({ success: false, channel: id, error: String(error) });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return results;
|
|
225
|
+
}
|
|
128
226
|
// --- Private Methods ------------------------------------------------
|
|
129
227
|
createAdapter(config) {
|
|
130
228
|
switch (config.type) {
|
|
@@ -142,7 +240,7 @@ export class NotificationCenter {
|
|
|
142
240
|
return null;
|
|
143
241
|
}
|
|
144
242
|
}
|
|
145
|
-
buildPayload(event, context) {
|
|
243
|
+
buildPayload(event, context, options) {
|
|
146
244
|
const { title, message } = this.getEventContent(event, context);
|
|
147
245
|
return {
|
|
148
246
|
event,
|
|
@@ -156,6 +254,10 @@ export class NotificationCenter {
|
|
|
156
254
|
...(context.taskId && { taskId: context.taskId }),
|
|
157
255
|
...(context.taskTitle && { taskTitle: context.taskTitle }),
|
|
158
256
|
...(context.error && { error: context.error }),
|
|
257
|
+
// Pass inline keyboard options to Telegram adapter
|
|
258
|
+
...(options?.enableInlineKeyboard && { _enableInlineKeyboard: true }),
|
|
259
|
+
...(options?.actionButtons && { _actionButtons: options.actionButtons }),
|
|
260
|
+
...(options?.additionalDetails && options.additionalDetails),
|
|
159
261
|
},
|
|
160
262
|
};
|
|
161
263
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-center.js","sourceRoot":"","sources":["../../src/notification-center.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAqB,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,OAAO,kBAAkB;IACtB,QAAQ,GAAgC,IAAI,GAAG,EAAE,CAAC;IAClD,cAAc,CAAW;IAEjC,YAAY,MAA2B;QACtC,IAAI,CAAC,cAAc;YAClB,MAAM,EAAE,cAAc,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAE3D,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;YACtB,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC7C,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC3B,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;gBACrC,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAiC;QAChD,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;gBACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CACZ,oDAAoD,KAAK,EAAE,CAC3D,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACf,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,cAAc,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACJ,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,EAAE,EAAE,CAAC;oBACT,OAAO,CAAC,IAAI,CACX,gCAAgC,EAAE,wBAAwB,CAC1D,CAAC;gBACH,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CACX,gCAAgC,EAAE,0BAA0B,KAAK,EAAE,CACnE,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACX,KAAwB,EACxB,OAA4B;QAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,mCAAmC;QACnC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;YAC3D,IAAI,CAAC;gBACJ,wBAAwB;gBACxB,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,sDAAsD;gBACtD,OAAO,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,EAAE;oBACX,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;iBACpB,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAClB,SAAiB,EACjB,KAAwB,EACxB,OAA4B;QAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACrE,CAAC;IACF,CAAC;IAED;;OAEG;IACH,WAAW;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,YAAY;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,sBAAsB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,OAAO,YAAY,eAAe,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC,WAAW,CAAC;QAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,kBAAkB;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,OAAO,YAAY,eAAe,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,OAAgC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,OAAO,YAAY,eAAe,EAAE,CAAC;YACxC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,MAAc;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,OAAO,YAAY,eAAe,EAAE,CAAC;YACxC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,UAAkB;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,OAAO,YAAY,eAAe,EAAE,CAAC;YACxC,OAAO,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACvB,KAAwB,EACxB,OAA4B,EAC5B,OAMC;QAED,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,KAAK,CAAC;QACpD,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC;QAEjD,gBAAgB;QAChB,MAAM,OAAO,GAA2B;YACvC,EAAE,IAAI,EAAE,UAAU,YAAY,EAAE,EAAE,YAAY,EAAE,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;YAC3G,EAAE,IAAI,EAAE,UAAU,WAAW,EAAE,EAAE,YAAY,EAAE,iBAAiB,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;SACzG,CAAC;QAEF,oDAAoD;QACpD,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,IAAI,OAAO,YAAY,eAAe,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACJ,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE;wBACjD,oBAAoB,EAAE,IAAI;wBAC1B,aAAa,EAAE,OAAO;wBACtB,GAAG,CAAC,OAAO,EAAE,iBAAiB,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;qBACnF,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrE,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACtB,KAAwB,EACxB,OAA4B,EAC5B,OAAgF,EAChF,OAGC;QAED,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,IAAI,OAAO,YAAY,eAAe,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACJ,MAAM,gBAAgB,GAA2B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACpE,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC;wBACrD,GAAG,EAAE,CAAC,CAAC,GAAG;qBACV,CAAC,CAAC,CAAC;oBAEJ,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE;wBACjD,oBAAoB,EAAE,IAAI;wBAC1B,aAAa,EAAE,gBAAgB;wBAC/B,GAAG,CAAC,OAAO,EAAE,iBAAiB,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;qBACnF,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrE,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,uEAAuE;IAE/D,aAAa,CACpB,MAAiC;QAEjC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,UAAU;gBACd,OAAO,IAAI,eAAe,CACzB,MAAM,CAAC,MAA6C,CACpD,CAAC;YACH,KAAK,MAAM;gBACV,OAAO,IAAI,WAAW,CACrB,MAAM,CAAC,MAAyC,CAChD,CAAC;YACH,KAAK,OAAO;gBACX,OAAO,IAAI,YAAY,CACtB,MAAM,CAAC,MAA0C,CACjD,CAAC;YACH,KAAK,SAAS;gBACb,OAAO,IAAI,cAAc,CACxB,MAAM,CAAC,MAA4C,CACnD,CAAC;YACH,KAAK,MAAM;gBACV,OAAO,IAAI,WAAW,CACrB,MAAM,CAAC,MAAyC,CAChD,CAAC;YACH;gBACC,OAAO,IAAI,CAAC;QACd,CAAC;IACF,CAAC;IAEO,YAAY,CACnB,KAAwB,EACxB,OAA4B,EAC5B,OAIC;QAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEhE,OAAO;YACN,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK;YACL,OAAO;YACP,OAAO,EAAE;gBACR,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjD,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC1D,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9C,mDAAmD;gBACnD,GAAG,CAAC,OAAO,EAAE,oBAAoB,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;gBACrE,GAAG,CAAC,OAAO,EAAE,aAAa,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;gBACxE,GAAG,CAAC,OAAO,EAAE,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC;aAC5D;SACD,CAAC;IACH,CAAC;IAEO,eAAe,CACtB,KAAwB,EACxB,OAA4B;QAE5B,MAAM,WAAW,GAChB,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE;YAC9B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;YAC1C,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QAExB,MAAM,GAAG,GAAkE;YAC1E,UAAU,EAAE;gBACX,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,6BAA6B,WAAW,GAAG;aACpD;YACD,aAAa,EAAE;gBACd,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,SAAS,OAAO,CAAC,SAAS,IAAI,SAAS,0BAA0B;aAC1E;YACD,UAAU,EAAE;gBACX,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,SAAS,OAAO,CAAC,SAAS,IAAI,SAAS,WAAW,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;aACtG;YACD,WAAW,EAAE;gBACZ,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,oEAAoE;aAC7E;YACD,eAAe,EAAE;gBAChB,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,6BAA6B,WAAW,GAAG;aACpD;YACD,gBAAgB,EAAE;gBACjB,KAAK,EAAE,mBAAmB;gBAC1B,OAAO,EAAE,uDAAuD,WAAW,GAAG;aAC9E;YACD,oBAAoB,EAAE;gBACrB,KAAK,EAAE,wBAAwB;gBAC/B,OAAO,EAAE,yDAAyD;aAClE;YACD,SAAS,EAAE;gBACV,KAAK,EAAE,iBAAiB;gBACxB,OAAO,EAAE,qCAAqC,WAAW,GAAG;aAC5D;YACD,iBAAiB,EAAE;gBAClB,KAAK,EAAE,qBAAqB;gBAC5B,OAAO,EAAE,6CAA6C;aACtD;YACD,cAAc,EAAE;gBACf,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,0DAA0D,WAAW,GAAG;aACjF;YACD,YAAY,EAAE;gBACb,KAAK,EAAE,eAAe;gBACtB,OAAO,EAAE,uBAAuB,WAAW,GAAG;aAC9C;YACD,mBAAmB,EAAE;gBACpB,KAAK,EAAE,mBAAmB;gBAC1B,OAAO,EAAE,kDAAkD,WAAW,GAAG;aACzE;YACD,mBAAmB,EAAE;gBACpB,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,sBAAsB,OAAO,CAAC,SAAS,IAAI,aAAa,iBAAiB;aAClF;YACD,iBAAiB,EAAE;gBAClB,KAAK,EAAE,qBAAqB;gBAC5B,OAAO,EAAE,4CAA4C;aACrD;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,eAAe;gBACtB,OAAO,EAAE,oBAAoB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;aACxE;SACD,CAAC;QAEF,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;IACnE,CAAC;IAEO,MAAM,CAAC,OAA4B;QAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE9D,4BAA4B;QAC5B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtD,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;gBAC7B,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;IAEO,wBAAwB;QAC/B,OAAO;YACN,mBAAmB,EAAE,gBAAgB;YACrC,gDAAgD,EAAE,4BAA4B;YAC9E,4BAA4B,EAAE,YAAY;YAC1C,0BAA0B,EAAE,UAAU;YACtC,0BAA0B,EAAE,UAAU;YACtC,+BAA+B,EAAE,WAAW;YAC5C,wBAAwB,EAAE,cAAc;SACxC,CAAC;IACH,CAAC;CACD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Policy Engine for intelligent routing
|
|
3
|
+
*
|
|
4
|
+
* Decides:
|
|
5
|
+
* 1. Should we notify at all?
|
|
6
|
+
* 2. What channel(s)?
|
|
7
|
+
* 3. Should we include approval buttons?
|
|
8
|
+
* 4. What's the priority level?
|
|
9
|
+
*
|
|
10
|
+
* Can be extended with Jev for AI-powered decisions:
|
|
11
|
+
* import { Jev } from "@type-safe/ai";
|
|
12
|
+
*/
|
|
13
|
+
export interface NotificationContext {
|
|
14
|
+
event: string;
|
|
15
|
+
jobId?: string;
|
|
16
|
+
requirement?: string;
|
|
17
|
+
error?: string;
|
|
18
|
+
severity?: "low" | "medium" | "high" | "critical";
|
|
19
|
+
requiresApproval?: boolean;
|
|
20
|
+
userId?: number;
|
|
21
|
+
timestamp?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface NotificationPolicy {
|
|
24
|
+
shouldNotify: boolean;
|
|
25
|
+
channels: ("telegram" | "tui" | "log")[];
|
|
26
|
+
includeButtons: boolean;
|
|
27
|
+
priority: "low" | "normal" | "high" | "urgent";
|
|
28
|
+
message?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface UserPreferences {
|
|
31
|
+
telegramEnabled: boolean;
|
|
32
|
+
telegramChatId?: string;
|
|
33
|
+
telegramBotToken?: string;
|
|
34
|
+
tuiEnabled: boolean;
|
|
35
|
+
notifyOnError: boolean;
|
|
36
|
+
notifyOnCompletion: boolean;
|
|
37
|
+
notifyOnApprovalRequired: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Notification policy engine
|
|
41
|
+
*/
|
|
42
|
+
export declare class NotificationPolicyEngine {
|
|
43
|
+
private preferences;
|
|
44
|
+
constructor(preferences?: Partial<UserPreferences>);
|
|
45
|
+
/**
|
|
46
|
+
* Update user preferences
|
|
47
|
+
*/
|
|
48
|
+
updatePreferences(prefs: Partial<UserPreferences>): void;
|
|
49
|
+
/**
|
|
50
|
+
* Evaluate notification policy
|
|
51
|
+
*/
|
|
52
|
+
evaluate(context: NotificationContext): NotificationPolicy;
|
|
53
|
+
/**
|
|
54
|
+
* Infer severity from event name
|
|
55
|
+
*/
|
|
56
|
+
private inferSeverity;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if an event requires approval buttons
|
|
60
|
+
*/
|
|
61
|
+
export declare function requiresApproval(event: string): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Check if an event is high priority
|
|
64
|
+
*/
|
|
65
|
+
export declare function isHighPriority(event: string): boolean;
|
|
66
|
+
//# sourceMappingURL=notification-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-policy.d.ts","sourceRoot":"","sources":["../../src/notification-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,CAAC,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wBAAwB,EAAE,OAAO,CAAC;CACnC;AAmCD;;GAEG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,WAAW,CAAkB;IAErC,YAAY,WAAW,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EAEjD;IAED;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAEvD;IAED;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CA4EzD;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;CAYtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Policy Engine for intelligent routing
|
|
3
|
+
*
|
|
4
|
+
* Decides:
|
|
5
|
+
* 1. Should we notify at all?
|
|
6
|
+
* 2. What channel(s)?
|
|
7
|
+
* 3. Should we include approval buttons?
|
|
8
|
+
* 4. What's the priority level?
|
|
9
|
+
*
|
|
10
|
+
* Can be extended with Jev for AI-powered decisions:
|
|
11
|
+
* import { Jev } from "@type-safe/ai";
|
|
12
|
+
*/
|
|
13
|
+
// Default preferences
|
|
14
|
+
const DEFAULT_PREFERENCES = {
|
|
15
|
+
telegramEnabled: false,
|
|
16
|
+
tuiEnabled: true,
|
|
17
|
+
notifyOnError: true,
|
|
18
|
+
notifyOnCompletion: false,
|
|
19
|
+
notifyOnApprovalRequired: true,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Events that require user approval
|
|
23
|
+
*/
|
|
24
|
+
const APPROVAL_REQUIRED_EVENTS = new Set([
|
|
25
|
+
"HumanReviewNeeded",
|
|
26
|
+
"WaitingForUserInput",
|
|
27
|
+
"ApprovalRequired",
|
|
28
|
+
"ConfirmDeploy",
|
|
29
|
+
"ConfirmDelete",
|
|
30
|
+
"ConfirmCriticalAction",
|
|
31
|
+
]);
|
|
32
|
+
/**
|
|
33
|
+
* High-priority events (always notify)
|
|
34
|
+
*/
|
|
35
|
+
const HIGH_PRIORITY_EVENTS = new Set([
|
|
36
|
+
"QuotaExhausted",
|
|
37
|
+
"CriticalError",
|
|
38
|
+
"HumanReviewNeeded",
|
|
39
|
+
"WaitingForUserInput",
|
|
40
|
+
"JobFailed",
|
|
41
|
+
"SystemAlert",
|
|
42
|
+
]);
|
|
43
|
+
/**
|
|
44
|
+
* Notification policy engine
|
|
45
|
+
*/
|
|
46
|
+
export class NotificationPolicyEngine {
|
|
47
|
+
preferences;
|
|
48
|
+
constructor(preferences) {
|
|
49
|
+
this.preferences = { ...DEFAULT_PREFERENCES, ...preferences };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Update user preferences
|
|
53
|
+
*/
|
|
54
|
+
updatePreferences(prefs) {
|
|
55
|
+
this.preferences = { ...this.preferences, ...prefs };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Evaluate notification policy
|
|
59
|
+
*/
|
|
60
|
+
evaluate(context) {
|
|
61
|
+
const event = context.event;
|
|
62
|
+
const severity = context.severity || this.inferSeverity(event);
|
|
63
|
+
const needsApproval = APPROVAL_REQUIRED_EVENTS.has(event);
|
|
64
|
+
// Build channels
|
|
65
|
+
const channels = [];
|
|
66
|
+
if (this.preferences.telegramEnabled && this.preferences.telegramChatId) {
|
|
67
|
+
channels.push("telegram");
|
|
68
|
+
}
|
|
69
|
+
if (this.preferences.tuiEnabled) {
|
|
70
|
+
channels.push("tui");
|
|
71
|
+
}
|
|
72
|
+
// Decide based on event type and severity
|
|
73
|
+
let shouldNotify = false;
|
|
74
|
+
let includeButtons = false;
|
|
75
|
+
let priority = "normal";
|
|
76
|
+
switch (event) {
|
|
77
|
+
case "HumanReviewNeeded":
|
|
78
|
+
case "WaitingForUserInput":
|
|
79
|
+
case "ApprovalRequired":
|
|
80
|
+
shouldNotify = this.preferences.notifyOnApprovalRequired;
|
|
81
|
+
includeButtons = true;
|
|
82
|
+
priority = "high";
|
|
83
|
+
break;
|
|
84
|
+
case "CriticalError":
|
|
85
|
+
case "SystemAlert":
|
|
86
|
+
shouldNotify = true;
|
|
87
|
+
includeButtons = needsApproval;
|
|
88
|
+
priority = "urgent";
|
|
89
|
+
break;
|
|
90
|
+
case "QuotaExhausted":
|
|
91
|
+
shouldNotify = true;
|
|
92
|
+
includeButtons = false;
|
|
93
|
+
priority = "high";
|
|
94
|
+
break;
|
|
95
|
+
case "JobCompleted":
|
|
96
|
+
shouldNotify = this.preferences.notifyOnCompletion;
|
|
97
|
+
includeButtons = false;
|
|
98
|
+
priority = "low";
|
|
99
|
+
break;
|
|
100
|
+
case "Error":
|
|
101
|
+
case "JobFailed":
|
|
102
|
+
shouldNotify = this.preferences.notifyOnError;
|
|
103
|
+
includeButtons = needsApproval;
|
|
104
|
+
priority = severity === "high" || severity === "critical" ? "high" : "normal";
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
shouldNotify = severity === "high" || severity === "critical";
|
|
108
|
+
includeButtons = needsApproval;
|
|
109
|
+
priority = severity === "critical" ? "urgent" : severity === "high" ? "high" : "low";
|
|
110
|
+
}
|
|
111
|
+
// Always notify for high-priority events
|
|
112
|
+
if (HIGH_PRIORITY_EVENTS.has(event)) {
|
|
113
|
+
shouldNotify = true;
|
|
114
|
+
if (priority !== "urgent") {
|
|
115
|
+
priority = "high";
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
shouldNotify,
|
|
120
|
+
channels: channels.length > 0 ? channels : ["log"],
|
|
121
|
+
includeButtons,
|
|
122
|
+
priority,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Infer severity from event name
|
|
127
|
+
*/
|
|
128
|
+
inferSeverity(event) {
|
|
129
|
+
if (event.includes("Critical") || event.includes("Emergency")) {
|
|
130
|
+
return "critical";
|
|
131
|
+
}
|
|
132
|
+
if (event.includes("Error") || event.includes("Failed") || event.includes("Exhausted")) {
|
|
133
|
+
return "high";
|
|
134
|
+
}
|
|
135
|
+
if (event.includes("Warning") || event.includes("Alert")) {
|
|
136
|
+
return "medium";
|
|
137
|
+
}
|
|
138
|
+
return "low";
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check if an event requires approval buttons
|
|
143
|
+
*/
|
|
144
|
+
export function requiresApproval(event) {
|
|
145
|
+
return APPROVAL_REQUIRED_EVENTS.has(event);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if an event is high priority
|
|
149
|
+
*/
|
|
150
|
+
export function isHighPriority(event) {
|
|
151
|
+
return HIGH_PRIORITY_EVENTS.has(event);
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=notification-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-policy.js","sourceRoot":"","sources":["../../src/notification-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Webhook Handler — RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Handles incoming webhook updates from Telegram (callback queries, messages).
|
|
5
|
+
* This enables 2-way communication with inline keyboard buttons.
|
|
6
|
+
*/
|
|
7
|
+
import type { TelegramAdapter } from "./adapters/telegram-adapter.js";
|
|
8
|
+
import type { TelegramCallbackHandler, TelegramCallbackQuery } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Predefined action prefixes for callback data
|
|
11
|
+
*/
|
|
12
|
+
export declare const CallbackActions: {
|
|
13
|
+
/** Approve/resume action */
|
|
14
|
+
readonly APPROVE: "approve";
|
|
15
|
+
/** Reject/cancel action */
|
|
16
|
+
readonly REJECT: "reject";
|
|
17
|
+
/** View details action */
|
|
18
|
+
readonly VIEW: "view";
|
|
19
|
+
/** Custom action prefix */
|
|
20
|
+
readonly CUSTOM: "custom";
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Parsed callback data structure
|
|
24
|
+
*/
|
|
25
|
+
export interface ParsedCallback {
|
|
26
|
+
action: string;
|
|
27
|
+
targetId: string;
|
|
28
|
+
payload?: Record<string, string>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse callback data string into structured object
|
|
32
|
+
* Format: "action_targetId" or "action_targetId_key1=val1,key2=val2"
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseCallbackData(data: string): ParsedCallback;
|
|
35
|
+
/**
|
|
36
|
+
* Build callback data string from components
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildCallbackData(action: string, targetId: string, payload?: Record<string, string>): string;
|
|
39
|
+
/**
|
|
40
|
+
* Create a standard Yes/No callback handler
|
|
41
|
+
*/
|
|
42
|
+
export declare function createYesNoHandler(options: {
|
|
43
|
+
/** Called when user clicks "Yes/Approve" */
|
|
44
|
+
onApprove?: (targetId: string, query: TelegramCallbackQuery) => Promise<void> | void;
|
|
45
|
+
/** Called when user clicks "No/Reject" */
|
|
46
|
+
onReject?: (targetId: string, query: TelegramCallbackQuery) => Promise<void> | void;
|
|
47
|
+
/** Custom handler for other callback actions */
|
|
48
|
+
onCustom?: (action: string, targetId: string, query: TelegramCallbackQuery) => Promise<void> | void;
|
|
49
|
+
/** Job manager reference for default resume/cancel behavior */
|
|
50
|
+
jobManager?: {
|
|
51
|
+
resume: (jobId: string) => Promise<void>;
|
|
52
|
+
cancel: (jobId: string) => Promise<void>;
|
|
53
|
+
};
|
|
54
|
+
}): TelegramCallbackHandler;
|
|
55
|
+
/**
|
|
56
|
+
* Telegram webhook route handler for Express/Fastify/etc.
|
|
57
|
+
*/
|
|
58
|
+
export declare function createTelegramWebhookHandler(adapter: TelegramAdapter, secretToken?: string): (req: {
|
|
59
|
+
body: Record<string, unknown>;
|
|
60
|
+
headers: Record<string, string | undefined>;
|
|
61
|
+
}, res: {
|
|
62
|
+
sendStatus: (code: number) => void;
|
|
63
|
+
}) => Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Notification payload helper with inline keyboard support
|
|
66
|
+
*/
|
|
67
|
+
export declare function createInteractivePayload(event: string, jobId: string, title: string, message: string, buttons: Array<{
|
|
68
|
+
text: string;
|
|
69
|
+
action: string;
|
|
70
|
+
targetId: string;
|
|
71
|
+
}>, details?: Record<string, unknown>): {
|
|
72
|
+
event: string;
|
|
73
|
+
jobId: string;
|
|
74
|
+
timestamp: string;
|
|
75
|
+
title: string;
|
|
76
|
+
message: string;
|
|
77
|
+
details?: Record<string, unknown>;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Update TelegramConfig to include action buttons from payload details
|
|
81
|
+
*/
|
|
82
|
+
export declare function extractButtonsFromPayload(details: Record<string, unknown> | undefined): Array<{
|
|
83
|
+
text: string;
|
|
84
|
+
callbackData: string;
|
|
85
|
+
}> | undefined;
|
|
86
|
+
//# sourceMappingURL=telegram-webhook-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-webhook-handler.d.ts","sourceRoot":"","sources":["../../src/telegram-webhook-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Webhook Handler — RFC-0022
|
|
3
|
+
*
|
|
4
|
+
* Handles incoming webhook updates from Telegram (callback queries, messages).
|
|
5
|
+
* This enables 2-way communication with inline keyboard buttons.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Predefined action prefixes for callback data
|
|
9
|
+
*/
|
|
10
|
+
export const CallbackActions = {
|
|
11
|
+
/** Approve/resume action */
|
|
12
|
+
APPROVE: "approve",
|
|
13
|
+
/** Reject/cancel action */
|
|
14
|
+
REJECT: "reject",
|
|
15
|
+
/** View details action */
|
|
16
|
+
VIEW: "view",
|
|
17
|
+
/** Custom action prefix */
|
|
18
|
+
CUSTOM: "custom",
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Parse callback data string into structured object
|
|
22
|
+
* Format: "action_targetId" or "action_targetId_key1=val1,key2=val2"
|
|
23
|
+
*/
|
|
24
|
+
export function parseCallbackData(data) {
|
|
25
|
+
const parts = data.split("_");
|
|
26
|
+
const action = parts[0] || "";
|
|
27
|
+
const targetId = parts[1] || "";
|
|
28
|
+
let payload;
|
|
29
|
+
// Check for additional payload
|
|
30
|
+
const payloadPart = parts.slice(2).join("_");
|
|
31
|
+
if (payloadPart && payloadPart.includes("=")) {
|
|
32
|
+
payload = {};
|
|
33
|
+
for (const pair of payloadPart.split(",")) {
|
|
34
|
+
const [key, value] = pair.split("=");
|
|
35
|
+
if (key && value) {
|
|
36
|
+
payload[key] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return { action, targetId, payload };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build callback data string from components
|
|
44
|
+
*/
|
|
45
|
+
export function buildCallbackData(action, targetId, payload) {
|
|
46
|
+
let data = `${action}_${targetId}`;
|
|
47
|
+
if (payload && Object.keys(payload).length > 0) {
|
|
48
|
+
const pairs = Object.entries(payload)
|
|
49
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
50
|
+
.join(",");
|
|
51
|
+
data += `_${pairs}`;
|
|
52
|
+
}
|
|
53
|
+
return data;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a standard Yes/No callback handler
|
|
57
|
+
*/
|
|
58
|
+
export function createYesNoHandler(options) {
|
|
59
|
+
return async (data, query) => {
|
|
60
|
+
const parsed = parseCallbackData(data);
|
|
61
|
+
const { action, targetId } = parsed;
|
|
62
|
+
console.log(`[TelegramWebhook] Callback: action=${action}, target=${targetId}, from=${query.from.username || query.from.first_name}`);
|
|
63
|
+
switch (action) {
|
|
64
|
+
case CallbackActions.APPROVE:
|
|
65
|
+
if (options.onApprove) {
|
|
66
|
+
await options.onApprove(targetId, query);
|
|
67
|
+
}
|
|
68
|
+
else if (options.jobManager) {
|
|
69
|
+
await options.jobManager.resume(targetId);
|
|
70
|
+
console.log(`[TelegramWebhook] Job resumed: ${targetId}`);
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case CallbackActions.REJECT:
|
|
74
|
+
if (options.onReject) {
|
|
75
|
+
await options.onReject(targetId, query);
|
|
76
|
+
}
|
|
77
|
+
else if (options.jobManager) {
|
|
78
|
+
await options.jobManager.cancel(targetId);
|
|
79
|
+
console.log(`[TelegramWebhook] Job cancelled: ${targetId}`);
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case CallbackActions.VIEW:
|
|
83
|
+
if (options.onCustom) {
|
|
84
|
+
await options.onCustom(action, targetId, query);
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
if (options.onCustom) {
|
|
89
|
+
await options.onCustom(action, targetId, query);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.warn(`[TelegramWebhook] Unknown action: ${action}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Telegram webhook route handler for Express/Fastify/etc.
|
|
99
|
+
*/
|
|
100
|
+
export function createTelegramWebhookHandler(adapter, secretToken) {
|
|
101
|
+
return async (req, res) => {
|
|
102
|
+
// Verify secret token
|
|
103
|
+
if (secretToken) {
|
|
104
|
+
const receivedToken = req.headers["x-telegram-bot-api-secret-token"];
|
|
105
|
+
if (receivedToken !== secretToken) {
|
|
106
|
+
console.error("[TelegramWebhook] Unauthorized webhook request");
|
|
107
|
+
res.sendStatus(403);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
await adapter.handleWebhookUpdate(req.body);
|
|
113
|
+
res.sendStatus(200);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error("[TelegramWebhook] Error processing update:", error);
|
|
117
|
+
res.sendStatus(500);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Notification payload helper with inline keyboard support
|
|
123
|
+
*/
|
|
124
|
+
export function createInteractivePayload(event, jobId, title, message, buttons, details) {
|
|
125
|
+
return {
|
|
126
|
+
event,
|
|
127
|
+
jobId,
|
|
128
|
+
timestamp: new Date().toISOString(),
|
|
129
|
+
title,
|
|
130
|
+
message,
|
|
131
|
+
details: {
|
|
132
|
+
...details,
|
|
133
|
+
_callbackButtons: buttons.map((b) => ({
|
|
134
|
+
text: b.text,
|
|
135
|
+
callbackData: buildCallbackData(b.action, b.targetId),
|
|
136
|
+
})),
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Update TelegramConfig to include action buttons from payload details
|
|
142
|
+
*/
|
|
143
|
+
export function extractButtonsFromPayload(details) {
|
|
144
|
+
if (!details)
|
|
145
|
+
return undefined;
|
|
146
|
+
const cb = details._callbackButtons;
|
|
147
|
+
return cb?.length ? cb : undefined;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=telegram-webhook-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-webhook-handler.js","sourceRoot":"","sources":["../../src/telegram-webhook-handler.ts"],"names":[],"mappings":"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"}
|