pi-harness-runtime 1.1.147 → 1.1.150

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 (143) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/index.ts +41 -26
  3. package/package.json +3 -2
  4. package/packages/a2a-adapter/package.json +1 -1
  5. package/packages/architecture-generator/package.json +1 -1
  6. package/packages/auth/package.json +1 -1
  7. package/packages/autonomous-refactor/package.json +1 -1
  8. package/packages/autonomous-runtime/package.json +1 -1
  9. package/packages/cache-strategy/package.json +1 -1
  10. package/packages/capability-registry/package.json +1 -1
  11. package/packages/checkpoint/package.json +1 -1
  12. package/packages/cli-plugin-sdk/package.json +1 -1
  13. package/packages/clipboard/package.json +1 -1
  14. package/packages/clipboard-plugin/package.json +1 -1
  15. package/packages/code-generation/package.json +1 -1
  16. package/packages/code-review/package.json +1 -1
  17. package/packages/codex-adapter/package.json +1 -1
  18. package/packages/codex-watcher/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/context-compiler/package.json +1 -1
  21. package/packages/context-discovery/package.json +1 -1
  22. package/packages/context-manager/package.json +1 -1
  23. package/packages/cookie-sanitizer/package.json +1 -1
  24. package/packages/cost-optimizer/package.json +1 -1
  25. package/packages/dependency-analyzer/package.json +1 -1
  26. package/packages/django-plugin/package.json +1 -1
  27. package/packages/doc-generator/package.json +1 -1
  28. package/packages/evaluation-engine/package.json +1 -1
  29. package/packages/evaluation-runner/package.json +1 -1
  30. package/packages/event-bus/package.json +1 -1
  31. package/packages/event-store/package.json +1 -1
  32. package/packages/experience-replay/package.json +1 -1
  33. package/packages/feedback-collector/package.json +1 -1
  34. package/packages/file-copy-helper/dist/src/extension.js +186 -0
  35. package/packages/file-copy-helper/package.json +1 -1
  36. package/packages/framework-detector/package.json +1 -1
  37. package/packages/framework-plugin-sdk/package.json +1 -1
  38. package/packages/frappe-plugin/package.json +1 -1
  39. package/packages/generic-web-plugin/package.json +1 -1
  40. package/packages/health-monitor/package.json +1 -1
  41. package/packages/intent-analyzer/package.json +1 -1
  42. package/packages/jev-judge/package.json +1 -1
  43. package/packages/knowledge-graph/package.json +1 -1
  44. package/packages/knowledge-retrieval/package.json +1 -1
  45. package/packages/laravel-plugin/package.json +1 -1
  46. package/packages/learning-engine/package.json +1 -1
  47. package/packages/mcp-adapter/package.json +1 -1
  48. package/packages/memory-engine/package.json +1 -1
  49. package/packages/milestone-manager/package.json +1 -1
  50. package/packages/model-registry/package.json +1 -1
  51. package/packages/nextjs-plugin/package.json +1 -1
  52. package/packages/notification/dist/adapters/email-adapter.d.ts +17 -0
  53. package/packages/notification/dist/adapters/email-adapter.d.ts.map +1 -0
  54. package/packages/notification/dist/adapters/email-adapter.js +89 -0
  55. package/packages/notification/dist/adapters/email-adapter.js.map +1 -0
  56. package/packages/notification/dist/adapters/line-adapter.d.ts +17 -0
  57. package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -0
  58. package/packages/notification/dist/adapters/line-adapter.js +99 -0
  59. package/packages/notification/dist/adapters/line-adapter.js.map +1 -0
  60. package/packages/notification/dist/adapters/ntfy-adapter.d.ts +17 -0
  61. package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +1 -0
  62. package/packages/notification/dist/adapters/ntfy-adapter.js +84 -0
  63. package/packages/notification/dist/adapters/ntfy-adapter.js.map +1 -0
  64. package/packages/notification/dist/adapters/telegram-adapter.d.ts +56 -0
  65. package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -0
  66. package/packages/notification/dist/adapters/telegram-adapter.js +251 -0
  67. package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -0
  68. package/packages/notification/dist/adapters/webhook-adapter.d.ts +15 -0
  69. package/packages/notification/dist/adapters/webhook-adapter.d.ts.map +1 -0
  70. package/packages/notification/dist/adapters/webhook-adapter.js +64 -0
  71. package/packages/notification/dist/adapters/webhook-adapter.js.map +1 -0
  72. package/packages/notification/dist/base-adapter.d.ts +36 -0
  73. package/packages/notification/dist/base-adapter.d.ts.map +1 -0
  74. package/packages/notification/dist/base-adapter.js +39 -0
  75. package/packages/notification/dist/base-adapter.js.map +1 -0
  76. package/packages/notification/dist/index.d.ts +12 -0
  77. package/packages/notification/dist/index.d.ts.map +1 -0
  78. package/packages/notification/dist/index.js +12 -0
  79. package/packages/notification/dist/index.js.map +1 -0
  80. package/packages/notification/dist/notification-center.d.ts +89 -0
  81. package/packages/notification/dist/notification-center.d.ts.map +1 -0
  82. package/packages/notification/dist/notification-center.js +356 -0
  83. package/packages/notification/dist/notification-center.js.map +1 -0
  84. package/packages/notification/dist/notification-policy.d.ts +66 -0
  85. package/packages/notification/dist/notification-policy.d.ts.map +1 -0
  86. package/packages/notification/dist/notification-policy.js +153 -0
  87. package/packages/notification/dist/notification-policy.js.map +1 -0
  88. package/packages/notification/dist/telegram-webhook-handler.d.ts +86 -0
  89. package/packages/notification/dist/telegram-webhook-handler.d.ts.map +1 -0
  90. package/packages/notification/dist/telegram-webhook-handler.js +149 -0
  91. package/packages/notification/dist/telegram-webhook-handler.js.map +1 -0
  92. package/packages/notification/dist/types.d.ts +106 -0
  93. package/packages/notification/dist/types.d.ts.map +1 -0
  94. package/packages/notification/dist/types.js +7 -0
  95. package/packages/notification/dist/types.js.map +1 -0
  96. package/packages/notification/package.json +1 -1
  97. package/packages/observability/package.json +1 -1
  98. package/packages/okf-indexer/package.json +1 -1
  99. package/packages/paperclip-integration/package.json +1 -1
  100. package/packages/performance-optimizer/package.json +1 -1
  101. package/packages/privilege-broker/package.json +1 -1
  102. package/packages/project-analyzer/package.json +1 -1
  103. package/packages/project-bootstrap/package.json +1 -1
  104. package/packages/projection-engine/package.json +1 -1
  105. package/packages/prompt-compiler/package.json +1 -1
  106. package/packages/prompt-versioning/package.json +1 -1
  107. package/packages/provider-adapter-sdk/package.json +1 -1
  108. package/packages/provider-router/package.json +1 -1
  109. package/packages/provider-selector/package.json +1 -1
  110. package/packages/providers/package.json +1 -1
  111. package/packages/qdrant-skills/package.json +1 -1
  112. package/packages/quota-manager/package.json +1 -1
  113. package/packages/rate-limiter/package.json +1 -1
  114. package/packages/react-vite-plugin/package.json +1 -1
  115. package/packages/release-manager/package.json +1 -1
  116. package/packages/requirement-compiler/package.json +1 -1
  117. package/packages/runtime/package.json +1 -1
  118. package/packages/scheduler/package.json +1 -1
  119. package/packages/scheduler-adapter/package.json +1 -1
  120. package/packages/session/package.json +1 -1
  121. package/packages/session-api/package.json +1 -1
  122. package/packages/session-export/package.json +1 -1
  123. package/packages/shared-context/package.json +1 -1
  124. package/packages/skill-mcp-client/package.json +1 -1
  125. package/packages/skill-registry/package.json +1 -1
  126. package/packages/skills/package.json +1 -1
  127. package/packages/sprint-planner/package.json +1 -1
  128. package/packages/subscription-engine/package.json +1 -1
  129. package/packages/task-compiler/package.json +1 -1
  130. package/packages/tencentdb-memory/package.json +1 -1
  131. package/packages/tencentdb-sync/package.json +1 -1
  132. package/packages/test-data-generator/package.json +1 -1
  133. package/packages/test-generator/package.json +1 -1
  134. package/packages/todo-bd-sync/package.json +1 -1
  135. package/packages/token-estimation/package.json +1 -1
  136. package/packages/token-optimizer/package.json +1 -1
  137. package/packages/trajectory/package.json +1 -1
  138. package/packages/tui/package.json +1 -1
  139. package/packages/types/package.json +1 -1
  140. package/packages/workflow-events/package.json +1 -1
  141. package/packages/workspace-scanner/package.json +1 -1
  142. package/packages/worktree/package.json +1 -1
  143. package/packages/write-review/package.json +1 -1
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Notification Center — RFC-0022
3
+ *
4
+ * Main orchestration class for sending notifications across multiple channels.
5
+ *
6
+ * Security Rules (RFC-0022):
7
+ * - Do not send raw cookies, passwords, provider tokens
8
+ * - Redact sensitive data before sending
9
+ * - Notification failure does not crash runtime
10
+ */
11
+ import type { NotificationEvent, NotificationConfig, NotificationChannelConfig, NotificationResult, NotificationContext, TelegramCallbackHandler } from "./types.js";
12
+ import { TelegramAdapter } from "./adapters/telegram-adapter.js";
13
+ export declare class NotificationCenter {
14
+ private adapters;
15
+ private redactPatterns;
16
+ constructor(config?: NotificationConfig);
17
+ /**
18
+ * Register a new adapter
19
+ */
20
+ registerAdapter(config: NotificationChannelConfig): boolean;
21
+ /**
22
+ * Initialize all registered adapters
23
+ */
24
+ initialize(): Promise<void>;
25
+ /**
26
+ * Send a notification to all configured channels
27
+ */
28
+ notify(event: NotificationEvent, context: NotificationContext): Promise<NotificationResult[]>;
29
+ /**
30
+ * Send notification to a specific channel
31
+ */
32
+ notifyChannel(channelId: string, event: NotificationEvent, context: NotificationContext): Promise<NotificationResult>;
33
+ /**
34
+ * Check if any notifications are configured
35
+ */
36
+ hasChannels(): boolean;
37
+ /**
38
+ * List all configured channels
39
+ */
40
+ listChannels(): string[];
41
+ /**
42
+ * Get Telegram bot username if configured
43
+ */
44
+ getTelegramBotUsername(): string | undefined;
45
+ /**
46
+ * Get Telegram adapter for advanced operations (webhook setup, etc.)
47
+ */
48
+ getTelegramAdapter(): TelegramAdapter | undefined;
49
+ /**
50
+ * Set callback handler for Telegram inline keyboard button clicks
51
+ */
52
+ setTelegramCallbackHandler(handler: TelegramCallbackHandler): void;
53
+ /**
54
+ * Set webhook secret for Telegram updates verification
55
+ */
56
+ setTelegramWebhookSecret(secret: string): void;
57
+ /**
58
+ * Setup Telegram webhook for receiving updates
59
+ */
60
+ setupTelegramWebhook(webhookUrl: string): Promise<boolean>;
61
+ /**
62
+ * Send notification with interactive Yes/No buttons
63
+ */
64
+ notifyWithApproval(event: NotificationEvent, context: NotificationContext, options?: {
65
+ /** Custom button labels */
66
+ approveLabel?: string;
67
+ rejectLabel?: string;
68
+ /** Additional details for the message */
69
+ additionalDetails?: Record<string, unknown>;
70
+ }): Promise<NotificationResult[]>;
71
+ /**
72
+ * Send interactive notification with custom buttons
73
+ */
74
+ notifyWithButtons(event: NotificationEvent, context: NotificationContext, buttons: Array<{
75
+ text: string;
76
+ action: string;
77
+ targetId: string;
78
+ url?: string;
79
+ }>, options?: {
80
+ /** Additional details for the message */
81
+ additionalDetails?: Record<string, unknown>;
82
+ }): Promise<NotificationResult[]>;
83
+ private createAdapter;
84
+ private buildPayload;
85
+ private getEventContent;
86
+ private redact;
87
+ private getDefaultRedactPatterns;
88
+ }
89
+ //# sourceMappingURL=notification-center.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-center.d.ts","sourceRoot":"","sources":["../src/notification-center.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAEX,iBAAiB,EAEjB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EAEvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAOjE,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,cAAc,CAAW;IAEjC,YAAY,MAAM,CAAC,EAAE,kBAAkB,EAWtC;IAED;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAa1D;IAED;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBhC;IAED;;OAEG;IACG,MAAM,CACX,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwB/B;IAED;;OAEG;IACG,aAAa,CAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAY7B;IAED;;OAEG;IACH,WAAW,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE,CAEvB;IAED;;OAEG;IACH,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAM3C;IAED;;OAEG;IACH,kBAAkB,IAAI,eAAe,GAAG,SAAS,CAMhD;IAED;;OAEG;IACH,0BAA0B,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAKjE;IAED;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAK7C;IAED;;OAEG;IACG,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM/D;IAED;;OAEG;IACG,kBAAkB,CACvB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE;QACT,2BAA2B;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,yCAAyC;QACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,GACC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA8B/B;IAED;;OAEG;IACG,iBAAiB,CACtB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChF,OAAO,CAAC,EAAE;QACT,yCAAyC;QACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,GACC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA0B/B;IAID,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,eAAe;IA2EvB,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,wBAAwB;CAWhC"}
@@ -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"}