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,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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"}
|