@gamalan/pi-gateway 1.0.0

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 (75) hide show
  1. package/README.md +366 -0
  2. package/config/config.default.json +51 -0
  3. package/dist/adapters/base.d.ts +85 -0
  4. package/dist/adapters/base.js +34 -0
  5. package/dist/adapters/base.js.map +1 -0
  6. package/dist/adapters/discord.d.ts +53 -0
  7. package/dist/adapters/discord.js +224 -0
  8. package/dist/adapters/discord.js.map +1 -0
  9. package/dist/adapters/index.d.ts +13 -0
  10. package/dist/adapters/index.js +8 -0
  11. package/dist/adapters/index.js.map +1 -0
  12. package/dist/adapters/slack.d.ts +49 -0
  13. package/dist/adapters/slack.js +231 -0
  14. package/dist/adapters/slack.js.map +1 -0
  15. package/dist/adapters/telegram.d.ts +64 -0
  16. package/dist/adapters/telegram.js +274 -0
  17. package/dist/adapters/telegram.js.map +1 -0
  18. package/dist/adapters/twitch.d.ts +75 -0
  19. package/dist/adapters/twitch.js +222 -0
  20. package/dist/adapters/twitch.js.map +1 -0
  21. package/dist/adapters/websocket.d.ts +30 -0
  22. package/dist/adapters/websocket.js +132 -0
  23. package/dist/adapters/websocket.js.map +1 -0
  24. package/dist/adapters/whatsapp.d.ts +49 -0
  25. package/dist/adapters/whatsapp.js +251 -0
  26. package/dist/adapters/whatsapp.js.map +1 -0
  27. package/dist/background/index.d.ts +1 -0
  28. package/dist/background/index.js +2 -0
  29. package/dist/background/index.js.map +1 -0
  30. package/dist/background/manager.d.ts +70 -0
  31. package/dist/background/manager.js +291 -0
  32. package/dist/background/manager.js.map +1 -0
  33. package/dist/index.d.ts +18 -0
  34. package/dist/index.js +1275 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/logger.d.ts +12 -0
  37. package/dist/logger.js +39 -0
  38. package/dist/logger.js.map +1 -0
  39. package/dist/paths.d.ts +14 -0
  40. package/dist/paths.js +32 -0
  41. package/dist/paths.js.map +1 -0
  42. package/dist/security/auth.d.ts +91 -0
  43. package/dist/security/auth.js +316 -0
  44. package/dist/security/auth.js.map +1 -0
  45. package/dist/security/index.d.ts +1 -0
  46. package/dist/security/index.js +2 -0
  47. package/dist/security/index.js.map +1 -0
  48. package/dist/security/tool-policy.d.ts +66 -0
  49. package/dist/security/tool-policy.js +467 -0
  50. package/dist/security/tool-policy.js.map +1 -0
  51. package/dist/sessions/index.d.ts +1 -0
  52. package/dist/sessions/index.js +2 -0
  53. package/dist/sessions/index.js.map +1 -0
  54. package/dist/sessions/store.d.ts +64 -0
  55. package/dist/sessions/store.js +247 -0
  56. package/dist/sessions/store.js.map +1 -0
  57. package/package.json +57 -0
  58. package/src/adapters/base.ts +124 -0
  59. package/src/adapters/discord.ts +270 -0
  60. package/src/adapters/index.ts +13 -0
  61. package/src/adapters/slack.ts +313 -0
  62. package/src/adapters/telegram.ts +394 -0
  63. package/src/adapters/twitch.ts +316 -0
  64. package/src/adapters/websocket.ts +158 -0
  65. package/src/adapters/whatsapp.ts +296 -0
  66. package/src/background/index.ts +1 -0
  67. package/src/background/manager.ts +395 -0
  68. package/src/index.ts +1665 -0
  69. package/src/logger.ts +43 -0
  70. package/src/paths.ts +40 -0
  71. package/src/security/auth.ts +458 -0
  72. package/src/security/index.ts +1 -0
  73. package/src/security/tool-policy.ts +568 -0
  74. package/src/sessions/index.ts +1 -0
  75. package/src/sessions/store.ts +360 -0
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Background Task Manager - Hermes-style background session handling
3
+ *
4
+ * Features:
5
+ * - Isolated sessions for background tasks
6
+ * - Result delivery to parent session
7
+ * - Progress notifications
8
+ * - Timeout handling
9
+ */
10
+ import Database from "better-sqlite3";
11
+ import { join } from "path";
12
+ import { homedir } from "os";
13
+ import { existsSync, mkdirSync } from "fs";
14
+ import { spawn } from "node:child_process";
15
+ import { createBackgroundSession } from "../sessions/store.js";
16
+ import { randomBytes } from "node:crypto";
17
+ import { logger } from "../logger.js";
18
+ const GATEWAY_DIR = join(homedir(), ".pi");
19
+ const TASKS_DB = join(GATEWAY_DIR, "gateway-background-tasks.db");
20
+ let db = null;
21
+ const runningProcesses = new Map();
22
+ const progressCallbacks = new Map();
23
+ /**
24
+ * Initialize background tasks database
25
+ */
26
+ export function initBackgroundTasks() {
27
+ if (db)
28
+ return db;
29
+ if (!existsSync(GATEWAY_DIR)) {
30
+ mkdirSync(GATEWAY_DIR, { recursive: true });
31
+ }
32
+ db = new Database(TASKS_DB);
33
+ db.exec("PRAGMA journal_mode = WAL;");
34
+ // Tasks table
35
+ db.exec(`
36
+ CREATE TABLE IF NOT EXISTS background_tasks (
37
+ id TEXT PRIMARY KEY,
38
+ session_id TEXT NOT NULL,
39
+ parent_session_id TEXT NOT NULL,
40
+ command TEXT NOT NULL,
41
+ status TEXT NOT NULL DEFAULT 'running',
42
+ progress INTEGER NOT NULL DEFAULT 0,
43
+ progress_message TEXT,
44
+ result TEXT,
45
+ error TEXT,
46
+ created_at INTEGER NOT NULL,
47
+ started_at INTEGER,
48
+ completed_at INTEGER,
49
+ delivered_at INTEGER
50
+ )
51
+ `);
52
+ // Indexes
53
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_parent ON background_tasks(parent_session_id)`);
54
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_status ON background_tasks(status)`);
55
+ logger.info("[BackgroundTasks] Database initialized");
56
+ return db;
57
+ }
58
+ /**
59
+ * Start a background task
60
+ */
61
+ export function startBackgroundTask(parentSessionId, command, onProgress) {
62
+ const database = initBackgroundTasks();
63
+ const id = `bg-${Date.now()}-${randomBytes(4).toString("hex")}`;
64
+ const now = Date.now();
65
+ // Create background session
66
+ const session = createBackgroundSession("background", id, "system", parentSessionId);
67
+ // Create task record
68
+ const task = {
69
+ id,
70
+ sessionId: session.id,
71
+ parentSessionId,
72
+ command,
73
+ status: "running",
74
+ progress: 0,
75
+ createdAt: now,
76
+ };
77
+ database
78
+ .prepare(`
79
+ INSERT INTO background_tasks
80
+ (id, session_id, parent_session_id, command, status, progress, created_at)
81
+ VALUES (?, ?, ?, ?, ?, ?, ?)
82
+ `)
83
+ .run(id, session.id, parentSessionId, command, "running", 0, now);
84
+ // Register progress callback
85
+ if (onProgress) {
86
+ progressCallbacks.set(id, onProgress);
87
+ }
88
+ // Start the actual process
89
+ const proc = spawn("pi", ["--mode", "json", "--print", command], {
90
+ stdio: ["pipe", "pipe", "pipe"],
91
+ env: { ...process.env },
92
+ });
93
+ runningProcesses.set(id, proc);
94
+ let stdout = "";
95
+ let stderr = "";
96
+ proc.stdout?.on("data", (data) => {
97
+ stdout += data.toString();
98
+ // Parse progress updates
99
+ try {
100
+ const lines = stdout.split("\n").filter(Boolean);
101
+ for (const line of lines) {
102
+ const parsed = JSON.parse(line);
103
+ if (parsed.progress !== undefined) {
104
+ updateTaskProgress(id, parsed.progress, parsed.message);
105
+ }
106
+ }
107
+ }
108
+ catch {
109
+ // Not JSON yet
110
+ }
111
+ });
112
+ proc.stderr?.on("data", (data) => {
113
+ stderr += data.toString();
114
+ });
115
+ proc.on("close", (code) => {
116
+ runningProcesses.delete(id);
117
+ if (code === 0) {
118
+ try {
119
+ const result = stdout.trim() ? JSON.parse(stdout) : { success: true };
120
+ completeTask(id, result);
121
+ }
122
+ catch {
123
+ completeTask(id, { success: true, output: stdout });
124
+ }
125
+ }
126
+ else {
127
+ failTask(id, stderr || `Process exited with code ${code}`);
128
+ }
129
+ });
130
+ proc.on("error", (err) => {
131
+ runningProcesses.delete(id);
132
+ failTask(id, err.message);
133
+ });
134
+ logger.info(`[BackgroundTasks] Started task ${id.slice(0, 12)}...`);
135
+ return task;
136
+ }
137
+ /**
138
+ * Update task progress
139
+ */
140
+ export function updateTaskProgress(taskId, progress, message) {
141
+ const database = initBackgroundTasks();
142
+ database
143
+ .prepare(`
144
+ UPDATE background_tasks SET progress = ?, progress_message = ?
145
+ WHERE id = ?
146
+ `)
147
+ .run(progress, message ?? null, taskId);
148
+ // Notify via callback
149
+ const callback = progressCallbacks.get(taskId);
150
+ if (callback) {
151
+ const task = getTask(taskId);
152
+ if (task)
153
+ callback(task);
154
+ }
155
+ }
156
+ /**
157
+ * Complete a task successfully
158
+ */
159
+ export function completeTask(taskId, result) {
160
+ const database = initBackgroundTasks();
161
+ const now = Date.now();
162
+ database
163
+ .prepare(`
164
+ UPDATE background_tasks
165
+ SET status = 'completed', progress = 100, result = ?, completed_at = ?
166
+ WHERE id = ?
167
+ `)
168
+ .run(JSON.stringify(result), now, taskId);
169
+ logger.info(`[BackgroundTasks] Task ${taskId.slice(0, 12)}... completed`);
170
+ }
171
+ /**
172
+ * Fail a task
173
+ */
174
+ export function failTask(taskId, error) {
175
+ const database = initBackgroundTasks();
176
+ const now = Date.now();
177
+ database
178
+ .prepare(`
179
+ UPDATE background_tasks
180
+ SET status = 'failed', error = ?, completed_at = ?
181
+ WHERE id = ?
182
+ `)
183
+ .run(error, now, taskId);
184
+ logger.info(`[BackgroundTasks] Task ${taskId.slice(0, 12)}... failed: ${error}`);
185
+ }
186
+ /**
187
+ * Mark task as delivered to user
188
+ */
189
+ export function markTaskDelivered(taskId) {
190
+ const database = initBackgroundTasks();
191
+ database
192
+ .prepare(`
193
+ UPDATE background_tasks SET status = 'delivered', delivered_at = ?
194
+ WHERE id = ?
195
+ `)
196
+ .run(Date.now(), taskId);
197
+ }
198
+ /**
199
+ * Get task by ID
200
+ */
201
+ export function getTask(taskId) {
202
+ const database = initBackgroundTasks();
203
+ const row = database
204
+ .prepare("SELECT * FROM background_tasks WHERE id = ?")
205
+ .get(taskId);
206
+ return row ? rowToTask(row) : null;
207
+ }
208
+ /**
209
+ * Get pending results for parent session
210
+ */
211
+ export function getPendingResultsForSession(parentSessionId) {
212
+ const database = initBackgroundTasks();
213
+ const rows = database
214
+ .prepare(`
215
+ SELECT * FROM background_tasks
216
+ WHERE parent_session_id = ? AND status IN ('completed', 'failed')
217
+ AND delivered_at IS NULL
218
+ ORDER BY created_at ASC
219
+ `)
220
+ .all(parentSessionId);
221
+ return rows.map(rowToTask);
222
+ }
223
+ /**
224
+ * List all tasks
225
+ */
226
+ export function listTasks(status) {
227
+ const database = initBackgroundTasks();
228
+ const query = status
229
+ ? "SELECT * FROM background_tasks WHERE status = ? ORDER BY created_at DESC"
230
+ : "SELECT * FROM background_tasks ORDER BY created_at DESC";
231
+ const rows = status
232
+ ? database.prepare(query).all(status)
233
+ : database.prepare(query).all();
234
+ return rows.map(rowToTask);
235
+ }
236
+ /**
237
+ * Cancel a running task
238
+ */
239
+ export function cancelTask(taskId) {
240
+ const proc = runningProcesses.get(taskId);
241
+ if (proc) {
242
+ proc.kill("SIGTERM");
243
+ runningProcesses.delete(taskId);
244
+ const database = initBackgroundTasks();
245
+ database
246
+ .prepare(`
247
+ UPDATE background_tasks SET status = 'failed', error = ?, completed_at = ?
248
+ WHERE id = ?
249
+ `)
250
+ .run("Cancelled by user", Date.now(), taskId);
251
+ return true;
252
+ }
253
+ return false;
254
+ }
255
+ /**
256
+ * Clean up old tasks
257
+ */
258
+ export function cleanupOldTasks(maxAgeMs = 7 * 24 * 60 * 60 * 1000) {
259
+ const database = initBackgroundTasks();
260
+ const cutoff = Date.now() - maxAgeMs;
261
+ const result = database
262
+ .prepare("DELETE FROM background_tasks WHERE created_at < ?")
263
+ .run(cutoff);
264
+ return result.changes;
265
+ }
266
+ // Helper to convert DB row to BackgroundTask
267
+ function rowToTask(row) {
268
+ return {
269
+ id: row.id,
270
+ sessionId: row.session_id,
271
+ parentSessionId: row.parent_session_id,
272
+ command: row.command,
273
+ status: row.status,
274
+ progress: row.progress,
275
+ progressMessage: row.progress_message ?? undefined,
276
+ result: (() => {
277
+ try {
278
+ return row.result ? JSON.parse(row.result) : undefined;
279
+ }
280
+ catch {
281
+ return undefined;
282
+ }
283
+ })(),
284
+ error: row.error ?? undefined,
285
+ createdAt: row.created_at,
286
+ startedAt: row.started_at ?? undefined,
287
+ completedAt: row.completed_at ?? undefined,
288
+ deliveredAt: row.delivered_at ?? undefined,
289
+ };
290
+ }
291
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/background/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAyCtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;AAElE,IAAI,EAAE,GAA6B,IAAI,CAAC;AACxC,MAAM,gBAAgB,GAA8B,IAAI,GAAG,EAAE,CAAC;AAC9D,MAAM,iBAAiB,GACtB,IAAI,GAAG,EAAE,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAClC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAEtC,cAAc;IACd,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;GAgBN,CAAC,CAAC;IAEJ,UAAU;IACV,EAAE,CAAC,IAAI,CACN,oFAAoF,CACpF,CAAC;IACF,EAAE,CAAC,IAAI,CACN,yEAAyE,CACzE,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAClC,eAAuB,EACvB,OAAe,EACf,UAA2C;IAE3C,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAEvC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,4BAA4B;IAC5B,MAAM,OAAO,GAAG,uBAAuB,CACtC,YAAY,EACZ,EAAE,EACF,QAAQ,EACR,eAAe,CACf,CAAC;IAEF,qBAAqB;IACrB,MAAM,IAAI,GAAmB;QAC5B,EAAE;QACF,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,eAAe;QACf,OAAO;QACP,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,GAAG;KACd,CAAC;IAEF,QAAQ;SACN,OAAO,CAAC;;;;GAIR,CAAC;SACD,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAEnE,6BAA6B;IAC7B,IAAI,UAAU,EAAE,CAAC;QAChB,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,2BAA2B;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;QAChE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;KACvB,CAAC,CAAC;IAEH,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAE/B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE1B,yBAAyB;QACzB,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACnC,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACzD,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,eAAe;QAChB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE5B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBACtE,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACR,YAAY,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACrD,CAAC;QACF,CAAC;aAAM,CAAC;YACP,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,4BAA4B,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CACjC,MAAc,EACd,QAAgB,EAChB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAEvC,QAAQ;SACN,OAAO,CAAC;;;GAGR,CAAC;SACD,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAEzC,sBAAsB;IACtB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,MAAe;IAC3D,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,QAAQ;SACN,OAAO,CAAC;;;;GAIR,CAAC;SACD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAE3C,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,KAAa;IACrD,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,QAAQ;SACN,OAAO,CAAC;;;;GAIR,CAAC;SACD,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAE1B,MAAM,CAAC,IAAI,CACV,0BAA0B,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,KAAK,EAAE,CACnE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC/C,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,QAAQ;SACN,OAAO,CAAC;;;GAGR,CAAC;SACD,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAc;IACrC,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ;SAClB,OAAO,CAAC,6CAA6C,CAAC;SACtD,GAAG,CAAC,MAAM,CAAwB,CAAC;IACrC,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAC1C,eAAuB;IAEvB,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAEvC,MAAM,IAAI,GAAG,QAAQ;SACnB,OAAO,CAAC;;;;;GAKR,CAAC;SACD,GAAG,CAAC,eAAe,CAAc,CAAC;IAEpC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAyB;IAClD,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAEvC,MAAM,KAAK,GAAG,MAAM;QACnB,CAAC,CAAC,0EAA0E;QAC5E,CAAC,CAAC,yDAAyD,CAAC;IAE7D,MAAM,IAAI,GAAG,MAAM;QAClB,CAAC,CAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAe;QACpD,CAAC,CAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAgB,CAAC;IAEhD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACxC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,IAAI,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrB,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;QACvC,QAAQ;aACN,OAAO,CAAC;;;KAGP,CAAC;aACF,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QAE/C,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,WAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IAE1C,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IACrC,MAAM,MAAM,GAAG,QAAQ;SACrB,OAAO,CAAC,mDAAmD,CAAC;SAC5D,GAAG,CAAC,MAAM,CAAC,CAAC;IACd,OAAO,MAAM,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,6CAA6C;AAC7C,SAAS,SAAS,CAAC,GAAY;IAC9B,OAAO;QACN,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,eAAe,EAAE,GAAG,CAAC,iBAAiB;QACtC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAA0B;QACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,eAAe,EAAE,GAAG,CAAC,gBAAgB,IAAI,SAAS;QAClD,MAAM,EAAE,CAAC,GAAG,EAAE;YACb,IAAI,CAAC;gBACJ,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,SAAS,CAAC;YAClB,CAAC;QACF,CAAC,CAAC,EAAE;QACJ,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;QAC7B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;QACtC,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;QAC1C,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;KAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * pi-gateway - Hermes-style Messaging Gateway
3
+ *
4
+ * Architecture:
5
+ * - Single background process
6
+ * - Platform adapters (Discord, Telegram, etc.)
7
+ * - Per-chat session management
8
+ * - Background task support
9
+ * - Security (allowlists, pairing)
10
+ *
11
+ * Usage:
12
+ * /gateway start [port] - Start the gateway
13
+ * /gateway stop - Stop the gateway
14
+ * /gateway status - Show status
15
+ * /gateway pair <code> - Approve pairing code
16
+ */
17
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
18
+ export default function (pi: ExtensionAPI): void;