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.
Files changed (142) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/package.json +3 -2
  3. package/packages/a2a-adapter/package.json +1 -1
  4. package/packages/architecture-generator/package.json +1 -1
  5. package/packages/auth/package.json +1 -1
  6. package/packages/autonomous-refactor/package.json +1 -1
  7. package/packages/autonomous-runtime/package.json +1 -1
  8. package/packages/cache-strategy/package.json +1 -1
  9. package/packages/capability-registry/package.json +1 -1
  10. package/packages/checkpoint/package.json +1 -1
  11. package/packages/cli-plugin-sdk/package.json +1 -1
  12. package/packages/clipboard/package.json +1 -1
  13. package/packages/clipboard-plugin/package.json +1 -1
  14. package/packages/code-generation/package.json +1 -1
  15. package/packages/code-review/package.json +1 -1
  16. package/packages/codex-adapter/package.json +1 -1
  17. package/packages/codex-watcher/package.json +1 -1
  18. package/packages/config-capture/package.json +1 -1
  19. package/packages/context-compiler/package.json +1 -1
  20. package/packages/context-discovery/package.json +1 -1
  21. package/packages/context-manager/package.json +1 -1
  22. package/packages/cookie-sanitizer/package.json +1 -1
  23. package/packages/cost-optimizer/package.json +1 -1
  24. package/packages/dependency-analyzer/package.json +1 -1
  25. package/packages/django-plugin/package.json +1 -1
  26. package/packages/doc-generator/package.json +1 -1
  27. package/packages/evaluation-engine/package.json +1 -1
  28. package/packages/evaluation-runner/package.json +1 -1
  29. package/packages/event-bus/package.json +1 -1
  30. package/packages/event-store/package.json +1 -1
  31. package/packages/experience-replay/package.json +1 -1
  32. package/packages/feedback-collector/package.json +1 -1
  33. package/packages/file-copy-helper/dist/src/extension.js +186 -0
  34. package/packages/file-copy-helper/package.json +1 -1
  35. package/packages/framework-detector/package.json +1 -1
  36. package/packages/framework-plugin-sdk/package.json +1 -1
  37. package/packages/frappe-plugin/package.json +1 -1
  38. package/packages/generic-web-plugin/package.json +1 -1
  39. package/packages/health-monitor/package.json +1 -1
  40. package/packages/intent-analyzer/package.json +1 -1
  41. package/packages/jev-judge/package.json +1 -1
  42. package/packages/knowledge-graph/package.json +1 -1
  43. package/packages/knowledge-retrieval/package.json +1 -1
  44. package/packages/laravel-plugin/package.json +1 -1
  45. package/packages/learning-engine/package.json +1 -1
  46. package/packages/mcp-adapter/package.json +1 -1
  47. package/packages/memory-engine/package.json +1 -1
  48. package/packages/milestone-manager/package.json +1 -1
  49. package/packages/model-registry/package.json +1 -1
  50. package/packages/nextjs-plugin/package.json +1 -1
  51. package/packages/notification/dist/adapters/email-adapter.d.ts +17 -0
  52. package/packages/notification/dist/adapters/email-adapter.d.ts.map +1 -0
  53. package/packages/notification/dist/adapters/email-adapter.js +89 -0
  54. package/packages/notification/dist/adapters/email-adapter.js.map +1 -0
  55. package/packages/notification/dist/adapters/line-adapter.d.ts +17 -0
  56. package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -0
  57. package/packages/notification/dist/adapters/line-adapter.js +99 -0
  58. package/packages/notification/dist/adapters/line-adapter.js.map +1 -0
  59. package/packages/notification/dist/adapters/ntfy-adapter.d.ts +17 -0
  60. package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +1 -0
  61. package/packages/notification/dist/adapters/ntfy-adapter.js +84 -0
  62. package/packages/notification/dist/adapters/ntfy-adapter.js.map +1 -0
  63. package/packages/notification/dist/adapters/telegram-adapter.d.ts +56 -0
  64. package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -0
  65. package/packages/notification/dist/adapters/telegram-adapter.js +251 -0
  66. package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -0
  67. package/packages/notification/dist/adapters/webhook-adapter.d.ts +15 -0
  68. package/packages/notification/dist/adapters/webhook-adapter.d.ts.map +1 -0
  69. package/packages/notification/dist/adapters/webhook-adapter.js +64 -0
  70. package/packages/notification/dist/adapters/webhook-adapter.js.map +1 -0
  71. package/packages/notification/dist/base-adapter.d.ts +36 -0
  72. package/packages/notification/dist/base-adapter.d.ts.map +1 -0
  73. package/packages/notification/dist/base-adapter.js +39 -0
  74. package/packages/notification/dist/base-adapter.js.map +1 -0
  75. package/packages/notification/dist/index.d.ts +12 -0
  76. package/packages/notification/dist/index.d.ts.map +1 -0
  77. package/packages/notification/dist/index.js +12 -0
  78. package/packages/notification/dist/index.js.map +1 -0
  79. package/packages/notification/dist/notification-center.d.ts +89 -0
  80. package/packages/notification/dist/notification-center.d.ts.map +1 -0
  81. package/packages/notification/dist/notification-center.js +356 -0
  82. package/packages/notification/dist/notification-center.js.map +1 -0
  83. package/packages/notification/dist/notification-policy.d.ts +66 -0
  84. package/packages/notification/dist/notification-policy.d.ts.map +1 -0
  85. package/packages/notification/dist/notification-policy.js +153 -0
  86. package/packages/notification/dist/notification-policy.js.map +1 -0
  87. package/packages/notification/dist/telegram-webhook-handler.d.ts +86 -0
  88. package/packages/notification/dist/telegram-webhook-handler.d.ts.map +1 -0
  89. package/packages/notification/dist/telegram-webhook-handler.js +149 -0
  90. package/packages/notification/dist/telegram-webhook-handler.js.map +1 -0
  91. package/packages/notification/dist/types.d.ts +106 -0
  92. package/packages/notification/dist/types.d.ts.map +1 -0
  93. package/packages/notification/dist/types.js +7 -0
  94. package/packages/notification/dist/types.js.map +1 -0
  95. package/packages/notification/package.json +1 -1
  96. package/packages/observability/package.json +1 -1
  97. package/packages/okf-indexer/package.json +1 -1
  98. package/packages/paperclip-integration/package.json +1 -1
  99. package/packages/performance-optimizer/package.json +1 -1
  100. package/packages/privilege-broker/package.json +1 -1
  101. package/packages/project-analyzer/package.json +1 -1
  102. package/packages/project-bootstrap/package.json +1 -1
  103. package/packages/projection-engine/package.json +1 -1
  104. package/packages/prompt-compiler/package.json +1 -1
  105. package/packages/prompt-versioning/package.json +1 -1
  106. package/packages/provider-adapter-sdk/package.json +1 -1
  107. package/packages/provider-router/package.json +1 -1
  108. package/packages/provider-selector/package.json +1 -1
  109. package/packages/providers/package.json +1 -1
  110. package/packages/qdrant-skills/package.json +1 -1
  111. package/packages/quota-manager/package.json +1 -1
  112. package/packages/rate-limiter/package.json +1 -1
  113. package/packages/react-vite-plugin/package.json +1 -1
  114. package/packages/release-manager/package.json +1 -1
  115. package/packages/requirement-compiler/package.json +1 -1
  116. package/packages/runtime/package.json +1 -1
  117. package/packages/scheduler/package.json +1 -1
  118. package/packages/scheduler-adapter/package.json +1 -1
  119. package/packages/session/package.json +1 -1
  120. package/packages/session-api/package.json +1 -1
  121. package/packages/session-export/package.json +1 -1
  122. package/packages/shared-context/package.json +1 -1
  123. package/packages/skill-mcp-client/package.json +1 -1
  124. package/packages/skill-registry/package.json +1 -1
  125. package/packages/skills/package.json +1 -1
  126. package/packages/sprint-planner/package.json +1 -1
  127. package/packages/subscription-engine/package.json +1 -1
  128. package/packages/task-compiler/package.json +1 -1
  129. package/packages/tencentdb-memory/package.json +1 -1
  130. package/packages/tencentdb-sync/package.json +1 -1
  131. package/packages/test-data-generator/package.json +1 -1
  132. package/packages/test-generator/package.json +1 -1
  133. package/packages/todo-bd-sync/package.json +1 -1
  134. package/packages/token-estimation/package.json +1 -1
  135. package/packages/token-optimizer/package.json +1 -1
  136. package/packages/trajectory/package.json +1 -1
  137. package/packages/tui/package.json +1 -1
  138. package/packages/types/package.json +1 -1
  139. package/packages/workflow-events/package.json +1 -1
  140. package/packages/workspace-scanner/package.json +1 -1
  141. package/packages/worktree/package.json +1 -1
  142. package/packages/write-review/package.json +1 -1
@@ -0,0 +1,356 @@
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 { TelegramAdapter } from "./adapters/telegram-adapter.js";
12
+ import { buildCallbackData, CallbackActions } from "./telegram-webhook-handler.js";
13
+ import { LineAdapter } from "./adapters/line-adapter.js";
14
+ import { NtfyAdapter } from "./adapters/ntfy-adapter.js";
15
+ import { EmailAdapter } from "./adapters/email-adapter.js";
16
+ import { WebhookAdapter } from "./adapters/webhook-adapter.js";
17
+ export class NotificationCenter {
18
+ adapters = new Map();
19
+ redactPatterns;
20
+ constructor(config) {
21
+ this.redactPatterns =
22
+ config?.redactPatterns ?? this.getDefaultRedactPatterns();
23
+ if (config?.channels) {
24
+ for (const channelConfig of config.channels) {
25
+ if (channelConfig.enabled) {
26
+ this.registerAdapter(channelConfig);
27
+ }
28
+ }
29
+ }
30
+ }
31
+ /**
32
+ * Register a new adapter
33
+ */
34
+ registerAdapter(config) {
35
+ try {
36
+ const adapter = this.createAdapter(config);
37
+ if (adapter && adapter.isConfigured()) {
38
+ this.adapters.set(config.id, adapter);
39
+ return true;
40
+ }
41
+ }
42
+ catch (error) {
43
+ console.error(`[NotificationCenter] Failed to register adapter: ${error}`);
44
+ }
45
+ return false;
46
+ }
47
+ /**
48
+ * Initialize all registered adapters
49
+ */
50
+ async initialize() {
51
+ const adapterEntries = Array.from(this.adapters.entries());
52
+ for (const [id, adapter] of adapterEntries) {
53
+ try {
54
+ const ok = await adapter.initialize();
55
+ if (!ok) {
56
+ console.warn(`[NotificationCenter] Adapter ${id} initialization failed`);
57
+ }
58
+ }
59
+ catch (error) {
60
+ console.warn(`[NotificationCenter] Adapter ${id} initialization error: ${error}`);
61
+ }
62
+ }
63
+ }
64
+ /**
65
+ * Send a notification to all configured channels
66
+ */
67
+ async notify(event, context) {
68
+ const payload = this.buildPayload(event, context);
69
+ const results = [];
70
+ // Send to all adapters in parallel
71
+ const adapterEntries = Array.from(this.adapters.entries());
72
+ const promises = adapterEntries.map(async ([id, adapter]) => {
73
+ try {
74
+ // Redact sensitive data
75
+ const redactedPayload = this.redact(payload);
76
+ const result = await adapter.send(redactedPayload);
77
+ results.push(result);
78
+ }
79
+ catch (error) {
80
+ // Never crash the runtime due to notification failure
81
+ results.push({
82
+ success: false,
83
+ channel: id,
84
+ error: String(error),
85
+ });
86
+ }
87
+ });
88
+ await Promise.all(promises);
89
+ return results;
90
+ }
91
+ /**
92
+ * Send notification to a specific channel
93
+ */
94
+ async notifyChannel(channelId, event, context) {
95
+ const adapter = this.adapters.get(channelId);
96
+ if (!adapter) {
97
+ return { success: false, channel: channelId, error: "Adapter not found" };
98
+ }
99
+ try {
100
+ const payload = this.redact(this.buildPayload(event, context));
101
+ return await adapter.send(payload);
102
+ }
103
+ catch (error) {
104
+ return { success: false, channel: channelId, error: String(error) };
105
+ }
106
+ }
107
+ /**
108
+ * Check if any notifications are configured
109
+ */
110
+ hasChannels() {
111
+ return this.adapters.size > 0;
112
+ }
113
+ /**
114
+ * List all configured channels
115
+ */
116
+ listChannels() {
117
+ return Array.from(this.adapters.keys());
118
+ }
119
+ /**
120
+ * Get Telegram bot username if configured
121
+ */
122
+ getTelegramBotUsername() {
123
+ const adapter = this.adapters.get("telegram");
124
+ if (adapter instanceof TelegramAdapter) {
125
+ return adapter.botUsername;
126
+ }
127
+ return undefined;
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
+ }
226
+ // --- Private Methods ------------------------------------------------
227
+ createAdapter(config) {
228
+ switch (config.type) {
229
+ case "telegram":
230
+ return new TelegramAdapter(config.config);
231
+ case "ntfy":
232
+ return new NtfyAdapter(config.config);
233
+ case "email":
234
+ return new EmailAdapter(config.config);
235
+ case "webhook":
236
+ return new WebhookAdapter(config.config);
237
+ case "line":
238
+ return new LineAdapter(config.config);
239
+ default:
240
+ return null;
241
+ }
242
+ }
243
+ buildPayload(event, context, options) {
244
+ const { title, message } = this.getEventContent(event, context);
245
+ return {
246
+ event,
247
+ jobId: context.jobId,
248
+ timestamp: new Date().toISOString(),
249
+ title,
250
+ message,
251
+ details: {
252
+ jobId: context.jobId,
253
+ requirement: context.requirement,
254
+ ...(context.taskId && { taskId: context.taskId }),
255
+ ...(context.taskTitle && { taskTitle: context.taskTitle }),
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),
261
+ },
262
+ };
263
+ }
264
+ getEventContent(event, context) {
265
+ const requirement = context.requirement.length > 50
266
+ ? context.requirement.slice(0, 50) + "..."
267
+ : context.requirement;
268
+ const map = {
269
+ JobStarted: {
270
+ title: "Job Started",
271
+ message: `Harness job started for: "${requirement}"`,
272
+ },
273
+ TaskCompleted: {
274
+ title: "Task Completed",
275
+ message: `Task "${context.taskTitle ?? "Unknown"}" completed successfully`,
276
+ },
277
+ TaskFailed: {
278
+ title: "Task Failed",
279
+ message: `Task "${context.taskTitle ?? "Unknown"}" failed${context.error ? `: ${context.error}` : ""}`,
280
+ },
281
+ QuotaPaused: {
282
+ title: "Quota Paused",
283
+ message: `Job paused due to quota limit. Will auto-resume when quota resets.`,
284
+ },
285
+ ResumeScheduled: {
286
+ title: "Resume Scheduled",
287
+ message: `Job will resume work on: "${requirement}"`,
288
+ },
289
+ ContextCompacted: {
290
+ title: "Context Compacted",
291
+ message: `Session context was compacted to continue work on: "${requirement}"`,
292
+ },
293
+ OutputLimitContinued: {
294
+ title: "Output Limit Continued",
295
+ message: `Response was continued after hitting output token limit`,
296
+ },
297
+ E2EFailed: {
298
+ title: "E2E Test Failed",
299
+ message: `End-to-end tests failed for job: "${requirement}"`,
300
+ },
301
+ HumanReviewNeeded: {
302
+ title: "Human Review Needed",
303
+ message: `Job blocked. Please review and take action.`,
304
+ },
305
+ ReadyForClient: {
306
+ title: "Ready for Review",
307
+ message: `Job completed successfully and ready for your review: "${requirement}"`,
308
+ },
309
+ JobCancelled: {
310
+ title: "Job Cancelled",
311
+ message: `Job was cancelled: "${requirement}"`,
312
+ },
313
+ WaitingForUserInput: {
314
+ title: "Your Input Needed",
315
+ message: `Agent is waiting for your answer to continue: "${requirement}"`,
316
+ },
317
+ CodexSessionStarted: {
318
+ title: "Codex Session Started",
319
+ message: `Codex CLI session "${context.taskTitle ?? "new session"}" is now active`,
320
+ },
321
+ CodexPlanDetected: {
322
+ title: "Codex Plan Detected",
323
+ message: `Codex has a new plan ready for your review`,
324
+ },
325
+ Error: {
326
+ title: "Runtime Error",
327
+ message: `An error occurred${context.error ? `: ${context.error}` : ""}`,
328
+ },
329
+ };
330
+ return map[event] ?? { title: event, message: `Event: ${event}` };
331
+ }
332
+ redact(payload) {
333
+ const details = payload.details ? { ...payload.details } : {};
334
+ // Redact sensitive patterns
335
+ for (const pattern of this.redactPatterns) {
336
+ for (const [key, value] of Object.entries(details)) {
337
+ if (typeof value === "string" && pattern.test(value)) {
338
+ details[key] = "[REDACTED]";
339
+ }
340
+ }
341
+ }
342
+ return { ...payload, details };
343
+ }
344
+ getDefaultRedactPatterns() {
345
+ return [
346
+ /Bearer\s+[\w-]+/gi, // Bearer tokens
347
+ /channel[_-]?access[_-]?token["\s:=]+[^\s,}]+/gi, // LINE channel access token
348
+ /password["\s:=]+[^\s,}]+/gi, // passwords
349
+ /cookie["\s:=]+[^\s,}]+/gi, // cookies
350
+ /secret["\s:=]+[^\s,}]+/gi, // secrets
351
+ /api[_-]?key["\s:=]+[^\s,}]+/gi, // API keys
352
+ /auth["\s:=]+[^\s,}]+/gi, // auth tokens
353
+ ];
354
+ }
355
+ }
356
+ //# sourceMappingURL=notification-center.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-center.js","sourceRoot":"","sources":["../src/notification-center.ts"],"names":[],"mappings":"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"}
@@ -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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"}