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.
Files changed (176) hide show
  1. package/README.md +113 -0
  2. package/index.ts +136 -6
  3. package/package.json +2 -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/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/src/adapters/email-adapter.d.ts.map +1 -0
  52. package/packages/notification/dist/src/adapters/email-adapter.js.map +1 -0
  53. package/packages/notification/dist/src/adapters/line-adapter.d.ts.map +1 -0
  54. package/packages/notification/dist/src/adapters/line-adapter.js.map +1 -0
  55. package/packages/notification/dist/src/adapters/ntfy-adapter.d.ts.map +1 -0
  56. package/packages/notification/dist/src/adapters/ntfy-adapter.js.map +1 -0
  57. package/packages/notification/dist/src/adapters/telegram-adapter.d.ts +56 -0
  58. package/packages/notification/dist/src/adapters/telegram-adapter.d.ts.map +1 -0
  59. package/packages/notification/dist/src/adapters/telegram-adapter.js +251 -0
  60. package/packages/notification/dist/src/adapters/telegram-adapter.js.map +1 -0
  61. package/packages/notification/dist/src/adapters/webhook-adapter.d.ts.map +1 -0
  62. package/packages/notification/dist/src/adapters/webhook-adapter.js.map +1 -0
  63. package/packages/notification/dist/src/base-adapter.d.ts.map +1 -0
  64. package/packages/notification/dist/src/base-adapter.js.map +1 -0
  65. package/packages/notification/dist/{index.d.ts → src/index.d.ts} +2 -0
  66. package/packages/notification/dist/src/index.d.ts.map +1 -0
  67. package/packages/notification/dist/{index.js → src/index.js} +2 -0
  68. package/packages/notification/dist/src/index.js.map +1 -0
  69. package/packages/notification/dist/src/notification-center.d.ts +89 -0
  70. package/packages/notification/dist/src/notification-center.d.ts.map +1 -0
  71. package/packages/notification/dist/{notification-center.js → src/notification-center.js} +103 -1
  72. package/packages/notification/dist/src/notification-center.js.map +1 -0
  73. package/packages/notification/dist/src/notification-policy.d.ts +66 -0
  74. package/packages/notification/dist/src/notification-policy.d.ts.map +1 -0
  75. package/packages/notification/dist/src/notification-policy.js +153 -0
  76. package/packages/notification/dist/src/notification-policy.js.map +1 -0
  77. package/packages/notification/dist/src/telegram-webhook-handler.d.ts +86 -0
  78. package/packages/notification/dist/src/telegram-webhook-handler.d.ts.map +1 -0
  79. package/packages/notification/dist/src/telegram-webhook-handler.js +149 -0
  80. package/packages/notification/dist/src/telegram-webhook-handler.js.map +1 -0
  81. package/packages/notification/dist/{types.d.ts → src/types.d.ts} +37 -0
  82. package/packages/notification/dist/src/types.d.ts.map +1 -0
  83. package/packages/notification/dist/src/types.js.map +1 -0
  84. package/packages/notification/package.json +1 -1
  85. package/packages/notification/src/adapters/telegram-adapter.ts +187 -5
  86. package/packages/notification/src/index.ts +2 -0
  87. package/packages/notification/src/notification-center.ts +139 -0
  88. package/packages/notification/src/notification-policy.ts +203 -0
  89. package/packages/notification/src/telegram-webhook-handler.ts +211 -0
  90. package/packages/notification/src/types.ts +42 -0
  91. package/packages/observability/package.json +1 -1
  92. package/packages/okf-indexer/package.json +1 -1
  93. package/packages/paperclip-integration/dist/index.d.ts.map +1 -1
  94. package/packages/paperclip-integration/dist/index.js +30 -18
  95. package/packages/paperclip-integration/dist/index.js.map +1 -1
  96. package/packages/paperclip-integration/package.json +1 -1
  97. package/packages/paperclip-integration/src/index.ts +35 -20
  98. package/packages/performance-optimizer/package.json +1 -1
  99. package/packages/privilege-broker/package.json +1 -1
  100. package/packages/project-analyzer/package.json +1 -1
  101. package/packages/project-bootstrap/package.json +1 -1
  102. package/packages/projection-engine/package.json +1 -1
  103. package/packages/prompt-compiler/package.json +1 -1
  104. package/packages/prompt-versioning/package.json +1 -1
  105. package/packages/provider-adapter-sdk/package.json +1 -1
  106. package/packages/provider-router/package.json +1 -1
  107. package/packages/provider-selector/package.json +1 -1
  108. package/packages/providers/package.json +1 -1
  109. package/packages/qdrant-skills/package.json +1 -1
  110. package/packages/quota-manager/package.json +1 -1
  111. package/packages/rate-limiter/package.json +1 -1
  112. package/packages/react-vite-plugin/package.json +1 -1
  113. package/packages/release-manager/package.json +1 -1
  114. package/packages/requirement-compiler/package.json +1 -1
  115. package/packages/runtime/package.json +1 -1
  116. package/packages/scheduler/package.json +1 -1
  117. package/packages/scheduler-adapter/package.json +1 -1
  118. package/packages/session/package.json +1 -1
  119. package/packages/session-api/package.json +1 -1
  120. package/packages/session-export/package.json +1 -1
  121. package/packages/shared-context/package.json +1 -1
  122. package/packages/skill-mcp-client/package.json +1 -1
  123. package/packages/skill-registry/package.json +1 -1
  124. package/packages/skills/package.json +1 -1
  125. package/packages/sprint-planner/package.json +1 -1
  126. package/packages/subscription-engine/package.json +1 -1
  127. package/packages/task-compiler/package.json +1 -1
  128. package/packages/tencentdb-memory/package.json +1 -1
  129. package/packages/tencentdb-sync/package.json +1 -1
  130. package/packages/test-data-generator/package.json +1 -1
  131. package/packages/test-generator/package.json +1 -1
  132. package/packages/todo-bd-sync/package.json +1 -1
  133. package/packages/token-estimation/package.json +1 -1
  134. package/packages/token-optimizer/package.json +1 -1
  135. package/packages/trajectory/package.json +1 -1
  136. package/packages/tui/package.json +1 -1
  137. package/packages/types/package.json +1 -1
  138. package/packages/workflow-events/package.json +1 -1
  139. package/packages/workspace-scanner/package.json +1 -1
  140. package/packages/worktree/package.json +1 -1
  141. package/packages/write-review/package.json +1 -1
  142. package/scripts/telegram-callback-processor.ts +180 -0
  143. package/scripts/telegram-webhook-server.ts +387 -0
  144. package/scripts/test-telegram-approval.ts +64 -0
  145. package/packages/notification/dist/adapters/email-adapter.d.ts.map +0 -1
  146. package/packages/notification/dist/adapters/email-adapter.js.map +0 -1
  147. package/packages/notification/dist/adapters/line-adapter.d.ts.map +0 -1
  148. package/packages/notification/dist/adapters/line-adapter.js.map +0 -1
  149. package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +0 -1
  150. package/packages/notification/dist/adapters/ntfy-adapter.js.map +0 -1
  151. package/packages/notification/dist/adapters/telegram-adapter.d.ts +0 -19
  152. package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +0 -1
  153. package/packages/notification/dist/adapters/telegram-adapter.js +0 -97
  154. package/packages/notification/dist/adapters/telegram-adapter.js.map +0 -1
  155. package/packages/notification/dist/adapters/webhook-adapter.d.ts.map +0 -1
  156. package/packages/notification/dist/adapters/webhook-adapter.js.map +0 -1
  157. package/packages/notification/dist/base-adapter.d.ts.map +0 -1
  158. package/packages/notification/dist/base-adapter.js.map +0 -1
  159. package/packages/notification/dist/index.d.ts.map +0 -1
  160. package/packages/notification/dist/index.js.map +0 -1
  161. package/packages/notification/dist/notification-center.d.ts +0 -50
  162. package/packages/notification/dist/notification-center.d.ts.map +0 -1
  163. package/packages/notification/dist/notification-center.js.map +0 -1
  164. package/packages/notification/dist/types.d.ts.map +0 -1
  165. package/packages/notification/dist/types.js.map +0 -1
  166. /package/packages/notification/dist/{adapters → src/adapters}/email-adapter.d.ts +0 -0
  167. /package/packages/notification/dist/{adapters → src/adapters}/email-adapter.js +0 -0
  168. /package/packages/notification/dist/{adapters → src/adapters}/line-adapter.d.ts +0 -0
  169. /package/packages/notification/dist/{adapters → src/adapters}/line-adapter.js +0 -0
  170. /package/packages/notification/dist/{adapters → src/adapters}/ntfy-adapter.d.ts +0 -0
  171. /package/packages/notification/dist/{adapters → src/adapters}/ntfy-adapter.js +0 -0
  172. /package/packages/notification/dist/{adapters → src/adapters}/webhook-adapter.d.ts +0 -0
  173. /package/packages/notification/dist/{adapters → src/adapters}/webhook-adapter.js +0 -0
  174. /package/packages/notification/dist/{base-adapter.d.ts → src/base-adapter.d.ts} +0 -0
  175. /package/packages/notification/dist/{base-adapter.js → src/base-adapter.js} +0 -0
  176. /package/packages/notification/dist/{types.js → src/types.js} +0 -0
@@ -0,0 +1,387 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Telegram Webhook Server — RFC-0022
4
+ *
5
+ * Standalone server that:
6
+ * 1. Receives webhook updates from Telegram
7
+ * 2. Handles button clicks (approve/reject)
8
+ * 3. Forwards actions to pi-harness via file queue
9
+ *
10
+ * Usage:
11
+ * TELEGRAM_BOT_TOKEN=xxx TELEGRAM_WEBHOOK_SECRET=xxx TELEGRAM_WEBHOOK_URL=https://yourdomain.com/webhook bun run scripts/telegram-webhook-server.ts
12
+ */
13
+
14
+ import { existsSync, writeFileSync, appendFileSync, readFileSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { createServer } from "node:http";
17
+
18
+ // --- Configuration ---
19
+ const BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN;
20
+ const WEBHOOK_SECRET = process.env.TELEGRAM_WEBHOOK_SECRET || "default-secret-change-me";
21
+ const WEBHOOK_URL = process.env.TELEGRAM_WEBHOOK_URL;
22
+ const CALLBACK_QUEUE_FILE = process.env.CALLBACK_QUEUE_FILE || join(process.env.HOME || "/tmp", ".pi-harness-runtime", "callback-queue.jsonl");
23
+ const PORT = parseInt(process.env.PORT || "3000", 10);
24
+
25
+ // --- Verify config ---
26
+ if (!BOT_TOKEN) {
27
+ console.error("[TelegramWebhook] ERROR: TELEGRAM_BOT_TOKEN not set");
28
+ console.error("[TelegramWebhook] Usage:");
29
+ console.error("[TelegramWebhook] TELEGRAM_BOT_TOKEN=xxx bun run scripts/telegram-webhook-server.ts");
30
+ process.exit(1);
31
+ }
32
+
33
+ // --- Types ---
34
+ interface CallbackQuery {
35
+ id: string;
36
+ from: {
37
+ id: number;
38
+ is_bot: boolean;
39
+ first_name: string;
40
+ username?: string;
41
+ };
42
+ chat_instance: string;
43
+ data: string;
44
+ message?: {
45
+ chat: { id: number };
46
+ message_id: number;
47
+ };
48
+ }
49
+
50
+ interface TelegramUpdate {
51
+ update_id: number;
52
+ callback_query?: CallbackQuery;
53
+ }
54
+
55
+ interface QueuedCallback {
56
+ timestamp: string;
57
+ queryId: string;
58
+ userId: number;
59
+ username?: string;
60
+ data: string;
61
+ action: string;
62
+ targetId: string;
63
+ }
64
+
65
+ // --- Parse callback data ---
66
+ function parseCallbackData(data: string): { action: string; targetId: string } {
67
+ // Support both colon (approve:job-123) and underscore (approve_job-123) separators
68
+ // Also handle Telegram's underscore padding (approve:job-123_)
69
+ const cleanData = data.replace(/_+$/, ""); // Remove trailing underscores from Telegram padding
70
+
71
+ // Split by first colon or underscore
72
+ const colonIdx = cleanData.indexOf(":");
73
+ const underscoreIdx = cleanData.indexOf("_");
74
+
75
+ let action: string;
76
+ let targetId: string;
77
+
78
+ if (colonIdx !== -1 && (underscoreIdx === -1 || colonIdx < underscoreIdx)) {
79
+ // Colon comes first or is the only separator
80
+ action = cleanData.slice(0, colonIdx);
81
+ targetId = cleanData.slice(colonIdx + 1);
82
+ } else if (underscoreIdx !== -1) {
83
+ // Underscore comes first or is the only separator
84
+ action = cleanData.slice(0, underscoreIdx);
85
+ targetId = cleanData.slice(underscoreIdx + 1);
86
+ } else {
87
+ // No separator found
88
+ action = cleanData;
89
+ targetId = "";
90
+ }
91
+
92
+ return { action, targetId };
93
+ }
94
+
95
+ // --- Job Commands Management ---
96
+ const JOB_COMMANDS_FILE = join(process.env.HOME || "/tmp", ".pi-harness-runtime", "job-commands.jsonl");
97
+
98
+ interface JobCommand {
99
+ command: string;
100
+ jobId: string;
101
+ userId: number;
102
+ timestamp: string;
103
+ }
104
+
105
+ /**
106
+ * Read unacknowledged job commands from file
107
+ */
108
+ function readJobCommands(): JobCommand[] {
109
+ try {
110
+ if (!existsSync(JOB_COMMANDS_FILE)) {
111
+ return [];
112
+ }
113
+ const content = readFileSync(JOB_COMMANDS_FILE, "utf-8");
114
+ const lines = content.split("\n").filter(l => l.trim());
115
+ const commands: JobCommand[] = [];
116
+
117
+ for (const line of lines) {
118
+ try {
119
+ commands.push(JSON.parse(line));
120
+ } catch {
121
+ // Ignore parse errors
122
+ }
123
+ }
124
+ return commands;
125
+ } catch {
126
+ return [];
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Acknowledge (remove) processed job commands
132
+ */
133
+ function acknowledgeJobCommands(jobIds: string[]): void {
134
+ try {
135
+ const commands = readJobCommands();
136
+ const remaining = commands.filter(cmd => !jobIds.includes(cmd.jobId));
137
+
138
+ if (remaining.length === 0) {
139
+ // All commands processed - clear file
140
+ writeFileSync(JOB_COMMANDS_FILE, "", "utf-8");
141
+ } else {
142
+ // Keep unacknowledged commands
143
+ const newContent = remaining.map(cmd => JSON.stringify(cmd)).join("\n") + "\n";
144
+ writeFileSync(JOB_COMMANDS_FILE, newContent, "utf-8");
145
+ }
146
+ } catch {
147
+ // Ignore errors
148
+ }
149
+ }
150
+
151
+ // --- Queue callback to file ---
152
+ function queueCallback(callback: QueuedCallback): void {
153
+ const dir = join(CALLBACK_QUEUE_FILE, "..");
154
+ if (!existsSync(dir)) {
155
+ require("node:fs").mkdirSync(dir, { recursive: true });
156
+ }
157
+ appendFileSync(CALLBACK_QUEUE_FILE, JSON.stringify(callback) + "\n");
158
+ console.log(`[TelegramWebhook] Queued: ${callback.action}_${callback.targetId} from ${callback.username || callback.userId}`);
159
+ }
160
+
161
+ // --- Parse URL path ---
162
+ function parseUrlPath(url: string): { path: string } {
163
+ const [pathPart] = url.split('?');
164
+ return { path: pathPart };
165
+ }
166
+
167
+ // --- HTTP Request Handler ---
168
+ function handleRequest(req: import("node:http").IncomingMessage, res: import("node:http").ServerResponse): void {
169
+ const { path } = parseUrlPath(req.url || '/');
170
+
171
+ // CORS preflight - allow Telegram bot API and pi-harness clients
172
+ if (req.method === "OPTIONS") {
173
+ const origin = req.headers.origin;
174
+ // Allow Telegram's servers and any pi-harness client
175
+ const allowedOrigins = [
176
+ "https://api.telegram.org",
177
+ "https://web.telegram.org",
178
+ ];
179
+ const corsOrigin = allowedOrigins.includes(origin || "") ? origin || "" : "*";
180
+
181
+ res.writeHead(204, {
182
+ "Access-Control-Allow-Origin": corsOrigin,
183
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
184
+ "Access-Control-Allow-Headers": "Content-Type, x-telegram-bot-api-secret-token, Authorization",
185
+ });
186
+ res.end();
187
+ return;
188
+ }
189
+
190
+ // --- API: Get pending commands (for pi-harness polling) ---
191
+ if (req.method === "GET" && path === "/api/pending-commands") {
192
+ // Verify API key header
193
+ const apiKey = req.headers["authorization"]?.replace("Bearer ", "");
194
+ if (apiKey !== WEBHOOK_SECRET) {
195
+ res.writeHead(401, { "Content-Type": "application/json" });
196
+ res.end(JSON.stringify({ error: "Unauthorized" }));
197
+ return;
198
+ }
199
+
200
+ try {
201
+ // Read job commands from file
202
+ const jobCommands = readJobCommands();
203
+ // Allow any origin for API access
204
+ // Note: Authentication is via Bearer token in Authorization header
205
+ res.writeHead(200, {
206
+ "Content-Type": "application/json",
207
+ "Access-Control-Allow-Origin": "*",
208
+ "Cache-Control": "no-cache",
209
+ });
210
+ res.end(JSON.stringify({ commands: jobCommands }));
211
+ } catch (err) {
212
+ res.writeHead(500, { "Content-Type": "application/json" });
213
+ res.end(JSON.stringify({ error: "Internal error" }));
214
+ }
215
+ return;
216
+ }
217
+
218
+ // --- API: Acknowledge (consume) commands ---
219
+ if (req.method === "POST" && path === "/api/acknowledge-commands") {
220
+ const apiKey = req.headers["authorization"]?.replace("Bearer ", "");
221
+ if (apiKey !== WEBHOOK_SECRET) {
222
+ res.writeHead(401, { "Content-Type": "application/json" });
223
+ res.end(JSON.stringify({ error: "Unauthorized" }));
224
+ return;
225
+ }
226
+
227
+ let body = "";
228
+ req.on("data", (chunk: Buffer) => { body += chunk.toString(); });
229
+ req.on("end", () => {
230
+ try {
231
+ const { jobIds } = JSON.parse(body);
232
+ if (Array.isArray(jobIds)) {
233
+ acknowledgeJobCommands(jobIds);
234
+ }
235
+ res.writeHead(200, { "Content-Type": "application/json" });
236
+ res.end(JSON.stringify({ ok: true }));
237
+ } catch {
238
+ res.writeHead(400, { "Content-Type": "application/json" });
239
+ res.end(JSON.stringify({ error: "Invalid request" }));
240
+ }
241
+ });
242
+ return;
243
+ }
244
+
245
+ // --- Webhook: Only accept POST ---
246
+ if (req.method !== "POST") {
247
+ res.writeHead(405, { "Content-Type": "application/json" });
248
+ res.end(JSON.stringify({ error: "Method not allowed" }));
249
+ return;
250
+ }
251
+
252
+ // Verify secret token
253
+ const secret = req.headers["x-telegram-bot-api-secret-token"];
254
+ if (secret !== WEBHOOK_SECRET) {
255
+ console.warn("[TelegramWebhook] Unauthorized webhook attempt");
256
+ res.writeHead(403, { "Content-Type": "application/json" });
257
+ res.end(JSON.stringify({ error: "Forbidden" }));
258
+ return;
259
+ }
260
+
261
+ // Collect body
262
+ let body = "";
263
+ req.on("data", (chunk: Buffer) => { body += chunk.toString(); });
264
+ req.on("end", async () => {
265
+ try {
266
+ const update: TelegramUpdate = JSON.parse(body);
267
+
268
+ // Handle callback query
269
+ if (update.callback_query) {
270
+ const cq = update.callback_query;
271
+ const parsed = parseCallbackData(cq.data);
272
+
273
+ console.log(`[TelegramWebhook] Callback: ${cq.data} from ${cq.from.username || cq.from.first_name}`);
274
+
275
+ // Queue for pi-harness to process
276
+ const queued: QueuedCallback = {
277
+ timestamp: new Date().toISOString(),
278
+ queryId: cq.id,
279
+ userId: cq.from.id,
280
+ username: cq.from.username,
281
+ data: cq.data,
282
+ action: parsed.action,
283
+ targetId: parsed.targetId,
284
+ };
285
+ queueCallback(queued);
286
+
287
+ // Answer callback query (removes loading state)
288
+ await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/answerCallbackQuery`, {
289
+ method: "POST",
290
+ headers: { "Content-Type": "application/json" },
291
+ body: JSON.stringify({ callback_query_id: cq.id }),
292
+ });
293
+
294
+ // Send confirmation to user
295
+ const confirmText = parsed.action === "approve"
296
+ ? `✅ Approved! Job ${parsed.targetId} will resume.`
297
+ : parsed.action === "reject"
298
+ ? `❌ Rejected. Job ${parsed.targetId} cancelled.`
299
+ : `Received: ${cq.data}`;
300
+
301
+ if (cq.message?.chat.id) {
302
+ await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
303
+ method: "POST",
304
+ headers: { "Content-Type": "application/json" },
305
+ body: JSON.stringify({
306
+ chat_id: cq.message.chat.id,
307
+ text: confirmText,
308
+ }),
309
+ });
310
+ }
311
+ }
312
+
313
+ res.writeHead(200, { "Content-Type": "application/json" });
314
+ res.end(JSON.stringify({ ok: true }));
315
+ } catch (err) {
316
+ console.error("[TelegramWebhook] Error:", err);
317
+ res.writeHead(500, { "Content-Type": "application/json" });
318
+ res.end(JSON.stringify({ error: "Internal error" }));
319
+ }
320
+ });
321
+ }
322
+
323
+ // --- Setup webhook with Telegram ---
324
+ async function setupWebhook(): Promise<void> {
325
+ if (!WEBHOOK_URL) {
326
+ console.log("[TelegramWebhook] TELEGRAM_WEBHOOK_URL not set — skipping webhook setup");
327
+ console.log("[TelegramWebhook] To set webhook manually:");
328
+ console.log(`[TelegramWebhook] curl -X POST https://api.telegram.org/bot${BOT_TOKEN}/setWebhook -d '{"url":"YOUR_WEBHOOK_URL","secret_token":"${WEBHOOK_SECRET}"}'`);
329
+ return;
330
+ }
331
+
332
+ const response = await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/setWebhook`, {
333
+ method: "POST",
334
+ headers: { "Content-Type": "application/json" },
335
+ body: JSON.stringify({
336
+ url: WEBHOOK_URL,
337
+ secret_token: WEBHOOK_SECRET,
338
+ }),
339
+ });
340
+
341
+ const result = await response.json() as { ok: boolean; description?: string };
342
+ if (result.ok) {
343
+ console.log(`[TelegramWebhook] Webhook set to: ${WEBHOOK_URL}`);
344
+ } else {
345
+ console.error(`[TelegramWebhook] Webhook setup failed: ${result.description}`);
346
+ }
347
+ }
348
+
349
+ // --- Get current webhook info ---
350
+ async function getWebhookInfo(): Promise<void> {
351
+ const response = await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/getWebhookInfo`);
352
+ const result = await response.json() as { ok: boolean; result?: { url?: string; pending_update_count?: number } };
353
+ if (result.ok && result.result) {
354
+ console.log(`[TelegramWebhook] Current webhook: ${result.result.url || "(not set)"}`);
355
+ console.log(`[TelegramWebhook] Pending updates: ${result.result.pending_update_count || 0}`);
356
+ }
357
+ }
358
+
359
+ // --- Start server ---
360
+ async function main(): Promise<void> {
361
+ console.log("=".repeat(60));
362
+ console.log("Telegram Webhook Server — RFC-0022");
363
+ console.log("=".repeat(60));
364
+ console.log(`Bot token: ${BOT_TOKEN!.slice(0, 10)}...`);
365
+ console.log(`Webhook secret: ${WEBHOOK_SECRET.slice(0, 8)}...`);
366
+ console.log(`Callback queue: ${CALLBACK_QUEUE_FILE}`);
367
+ console.log(`Port: ${PORT}`);
368
+ console.log("=".repeat(60));
369
+
370
+ await setupWebhook();
371
+ await getWebhookInfo();
372
+
373
+ const server = createServer(handleRequest);
374
+ server.listen(PORT, () => {
375
+ console.log(`[TelegramWebhook] Server running on port ${PORT}`);
376
+ console.log("[TelegramWebhook] Waiting for Telegram callbacks...");
377
+ });
378
+
379
+ // Graceful shutdown
380
+ process.on("SIGINT", () => {
381
+ console.log("\n[TelegramWebhook] Shutting down...");
382
+ server.close();
383
+ process.exit(0);
384
+ });
385
+ }
386
+
387
+ main().catch(console.error);
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Test Telegram Approval Flow
3
+ *
4
+ * Sends a test message with Yes/No buttons to verify the full flow:
5
+ * 1. Message sent to Telegram with inline keyboard
6
+ * 2. User clicks button
7
+ * 3. Webhook receives callback
8
+ * 4. Callback processor handles approval/rejection
9
+ * 5. Job command written for pi-harness to resume
10
+ */
11
+
12
+ import * as fs from "node:fs";
13
+ import * as path from "node:path";
14
+
15
+ // Load config
16
+ const keysDir = path.join(process.env.HOME || "/home/frappe", ".pi-harness-runtime", "keys");
17
+
18
+ const botToken = fs.readFileSync(path.join(keysDir, "telegram-bot-token.txt"), "utf8").trim();
19
+ const chatId = fs.readFileSync(path.join(keysDir, "telegram-chat-id.txt"), "utf8").trim();
20
+
21
+ async function sendTestApproval() {
22
+ const message = `*Test Approval Request*\n\n` +
23
+ `A job is waiting for your approval:\n\n` +
24
+ `*Job:* Code Review for PR #123\n` +
25
+ `*Status:* Waiting for human review\n\n` +
26
+ `Do you want to approve this job to continue?`;
27
+
28
+ const inlineKeyboard = {
29
+ inline_keyboard: [
30
+ [
31
+ { text: "✅ Yes, Approve", callback_data: "approve:job-123" },
32
+ { text: "❌ No, Reject", callback_data: "reject:job-123" }
33
+ ],
34
+ [
35
+ { text: "🔄 Retry Later", callback_data: "retry:job-123" }
36
+ ]
37
+ ]
38
+ };
39
+
40
+ const response = await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
41
+ method: "POST",
42
+ headers: { "Content-Type": "application/json" },
43
+ body: JSON.stringify({
44
+ chat_id: chatId,
45
+ text: message,
46
+ parse_mode: "Markdown",
47
+ reply_markup: inlineKeyboard
48
+ })
49
+ });
50
+
51
+ const data = await response.json() as { ok: boolean; result?: { message_id: number } };
52
+
53
+ if (data.ok) {
54
+ console.log(`✅ Test message sent! Message ID: ${data.result?.message_id}`);
55
+ console.log(`\n📱 Check your Telegram for the approval message.`);
56
+ console.log(`\nWhen you click a button, the webhook at:`);
57
+ console.log(` https://telegram.moo-vpn.online/api/telegram/webhook`);
58
+ console.log(`\nwill receive the callback and process it.`);
59
+ } else {
60
+ console.error(`❌ Failed to send message:`, data);
61
+ }
62
+ }
63
+
64
+ sendTestApproval().catch(console.error);
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA0BxD,qBAAa,YAAa,SAAQ,kBAAkB;IACnD,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,WAAW;IAExB,YAAY,MAAM,EAAE,WAAW,EAE9B;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAWnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0BpE;IAED,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,QAAQ;CAiBhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-adapter.js","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"line-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/line-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,qBAAa,WAAY,SAAQ,kBAAkB;IAClD,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,IAAI,UAAU;IAEvB,YAAY,MAAM,EAAE,UAAU,EAE7B;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0CpE;IAED,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,QAAQ;CAiBhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"line-adapter.js","sourceRoot":"","sources":["../../src/adapters/line-adapter.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ntfy-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/ntfy-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,qBAAa,WAAY,SAAQ,kBAAkB;IAClD,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,IAAI,UAAU;IAEvB,YAAY,MAAM,EAAE,UAAU,EAE7B;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAGnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsCpE;IAED,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,OAAO;CAiBf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ntfy-adapter.js","sourceRoot":"","sources":["../../src/adapters/ntfy-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Telegram Adapter — RFC-0022
3
- *
4
- * Sends notifications via Telegram Bot API.
5
- */
6
- import type { NotificationPayload, NotificationResult, TelegramConfig } from "../types.js";
7
- import { BaseChannelAdapter } from "../base-adapter.js";
8
- export declare class TelegramAdapter extends BaseChannelAdapter {
9
- readonly id = "telegram";
10
- readonly type = "telegram";
11
- private _botUsername;
12
- constructor(config: TelegramConfig);
13
- get botUsername(): string | undefined;
14
- initialize(): Promise<boolean>;
15
- send(payload: NotificationPayload): Promise<NotificationResult>;
16
- private formatMessage;
17
- private getEmoji;
18
- }
19
- //# sourceMappingURL=telegram-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telegram-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/telegram-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,qBAAa,eAAgB,SAAQ,kBAAkB;IACvD,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,YAAY,CAAqB;IAEzC,YAAY,MAAM,EAAE,cAAc,EAEjC;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAEM,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAenC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmCpE;IAED,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,QAAQ;CAiBhB"}
@@ -1,97 +0,0 @@
1
- /**
2
- * Telegram Adapter — RFC-0022
3
- *
4
- * Sends notifications via Telegram Bot API.
5
- */
6
- import { BaseChannelAdapter } from "../base-adapter.js";
7
- export class TelegramAdapter extends BaseChannelAdapter {
8
- id = "telegram";
9
- type = "telegram";
10
- _botUsername;
11
- constructor(config) {
12
- super({ id: "telegram", type: "telegram", enabled: true, config });
13
- }
14
- get botUsername() {
15
- return this._botUsername;
16
- }
17
- async initialize() {
18
- try {
19
- const cfg = this.config.config;
20
- const response = await fetch(`https://api.telegram.org/bot${cfg.botToken}/getMe`);
21
- if (!response.ok)
22
- return false;
23
- const data = (await response.json());
24
- if (data.ok && data.result?.username) {
25
- this._botUsername = data.result.username;
26
- }
27
- return data.ok;
28
- }
29
- catch {
30
- return false;
31
- }
32
- }
33
- async send(payload) {
34
- try {
35
- const cfg = this.config.config;
36
- const message = this.formatMessage(payload);
37
- const response = await fetch(`https://api.telegram.org/bot${cfg.botToken}/sendMessage`, {
38
- method: "POST",
39
- headers: { "Content-Type": "application/json" },
40
- body: JSON.stringify({
41
- chat_id: cfg.chatId,
42
- text: message,
43
- parse_mode: cfg.parseMode ?? "MarkdownV2",
44
- }),
45
- });
46
- if (!response.ok) {
47
- const error = await response.text();
48
- return {
49
- success: false,
50
- channel: this.id,
51
- error: `Telegram API error: ${error}`,
52
- };
53
- }
54
- return { success: true, channel: this.id };
55
- }
56
- catch (error) {
57
- return {
58
- success: false,
59
- channel: this.id,
60
- error: String(error),
61
- };
62
- }
63
- }
64
- formatMessage(payload) {
65
- const emoji = this.getEmoji(payload.event);
66
- const title = `${emoji} ${payload.title}`;
67
- const lines = [title, "", payload.message];
68
- if (payload.details?.taskTitle) {
69
- lines.push("", `Task: ${payload.details.taskTitle}`);
70
- }
71
- if (payload.details?.jobId) {
72
- lines.push(`Job: ${payload.details.jobId}`);
73
- }
74
- if (payload.details?.error) {
75
- lines.push("", `Error: ${payload.details.error}`);
76
- }
77
- return lines.filter(Boolean).join("\n");
78
- }
79
- getEmoji(event) {
80
- const map = {
81
- JobStarted: "🚀",
82
- TaskCompleted: "✅",
83
- TaskFailed: "❌",
84
- QuotaPaused: "⏸️",
85
- ResumeScheduled: "▶️",
86
- ContextCompacted: "📦",
87
- OutputLimitContinued: "🔄",
88
- E2EFailed: "🧪",
89
- HumanReviewNeeded: "👤",
90
- ReadyForClient: "🎉",
91
- JobCancelled: "🚫",
92
- Error: "⚠️",
93
- };
94
- return map[event] ?? "📢";
95
- }
96
- }
97
- //# sourceMappingURL=telegram-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telegram-adapter.js","sourceRoot":"","sources":["../../src/adapters/telegram-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,OAAO,eAAgB,SAAQ,kBAAkB;IAC9C,EAAE,GAAG,UAAU,CAAC;IAChB,IAAI,GAAG,UAAU,CAAC;IACnB,YAAY,CAAqB;IAEzC,YAAY,MAAsB;QAClC,KAAK,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,WAAW;QACf,OAAO,IAAI,CAAC,YAAY,CAAC;IACzB,CAAC;IAEA,KAAK,CAAC,UAAU;QACf,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAwB,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC3B,+BAA+B,GAAG,CAAC,QAAQ,QAAQ,CACnD,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoD,CAAC;YACxF,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC1C,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA4B;QACtC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAwB,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC3B,+BAA+B,GAAG,CAAC,QAAQ,cAAc,EACzD;gBACC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACpB,OAAO,EAAE,GAAG,CAAC,MAAM;oBACnB,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,YAAY;iBACzC,CAAC;aACF,CACD,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,OAAO;oBACN,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,IAAI,CAAC,EAAE;oBAChB,KAAK,EAAE,uBAAuB,KAAK,EAAE;iBACrC,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACpB,CAAC;QACH,CAAC;IACF,CAAC;IAEO,aAAa,CAAC,OAA4B;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,GAAG,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,QAAQ,CAAC,KAAmC;QACnD,MAAM,GAAG,GAA2B;YACnC,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,GAAG;YAClB,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE,IAAI;YACrB,gBAAgB,EAAE,IAAI;YACtB,oBAAoB,EAAE,IAAI;YAC1B,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,IAAI;YACpB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,IAAI;SACX,CAAC;QACF,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC3B,CAAC;CACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhook-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/webhook-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,qBAAa,cAAe,SAAQ,kBAAkB;IACrD,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,aAAa;IAE1B,YAAY,MAAM,EAAE,aAAa,EAEhC;IAEK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAOnC;IAEK,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2CpE;CACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhook-adapter.js","sourceRoot":"","sources":["../../src/adapters/webhook-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IAC5C,EAAE,GAAG,SAAS,CAAC;IACf,IAAI,GAAG,SAAS,CAAC;IAE1B,YAAY,MAAqB;QAChC,KAAK,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,UAAU;QACf,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAuB,CAAC;YAChD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA4B;QACtC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAuB,CAAC;YAChD,MAAM,OAAO,GAA2B;gBACvC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aACtB,CAAC;YAEF,+BAA+B;YAC/B,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACnB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,GAAG,CAAC,SAAS,EAAE,CAAC;YACtD,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACrC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM;gBAC5B,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;iBACxB,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,OAAO;oBACN,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,IAAI,CAAC,EAAE;oBAChB,KAAK,EAAE,iBAAiB,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE;iBACnD,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACpB,CAAC;QACH,CAAC;IACF,CAAC;CACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../src/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEhE;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC;CACxB;AAED,8BAAsB,kBAAmB,YAAW,cAAc;IAIrD,SAAS,CAAC,MAAM,EAAE,yBAAyB;IAHvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B,YAAsB,MAAM,EAAE,yBAAyB,EAAI;IAE3D,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEzE,YAAY,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,SAAS,CAAC,MAAM,CACf,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,EAAE,GAChB,mBAAmB,CAsBrB;CACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../src/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4BH,MAAM,OAAgB,kBAAkB;IAIjB,MAAM;IAA5B,YAAsB,MAAiC;sBAAjC,MAAM;IAA8B,CAAC;IAK3D,YAAY;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED;;OAEG;IACO,MAAM,CACf,OAA4B,EAC5B,QAAkB;QAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAE1C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE9D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAClB,OAAmC,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;oBACzD,MAAM;gBACP,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO;YACN,GAAG,OAAO;YACV,OAAO;YACP,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACpD,CAAC;IACH,CAAC;CACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}