@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,132 @@
1
+ /**
2
+ * WebSocket Adapter - For web clients and other WebSocket-based platforms
3
+ */
4
+ import { BaseAdapter } from "./base.js";
5
+ import { logger } from "../logger.js";
6
+ export class WebSocketAdapter extends BaseAdapter {
7
+ platform = "websocket";
8
+ config;
9
+ client = null;
10
+ reconnectAttempts = 0;
11
+ maxReconnectAttempts = 5;
12
+ reconnectDelay = 1000;
13
+ constructor(config) {
14
+ super();
15
+ this.config = config;
16
+ }
17
+ async initialize() {
18
+ logger.info(`[WebSocket] Adapter initialized for client ${this.config.clientId}`);
19
+ }
20
+ async start(callbacks) {
21
+ await super.start(callbacks);
22
+ // For server-side: this would be handled by the main gateway
23
+ // This adapter is more for client-side connections
24
+ }
25
+ async connect(url, token) {
26
+ return new Promise((resolve, reject) => {
27
+ const headers = {};
28
+ if (token) {
29
+ headers["Authorization"] = `Bearer ${token}`;
30
+ }
31
+ this.client = new WebSocket(url, { headers });
32
+ this.client.onopen = () => {
33
+ logger.info(`[WebSocket] Connected to ${url}`);
34
+ this.reconnectAttempts = 0;
35
+ resolve();
36
+ };
37
+ this.client.onmessage = (event) => {
38
+ try {
39
+ const data = JSON.parse(event.data);
40
+ if (data.type === "message") {
41
+ const message = {
42
+ id: this.generateMessageId(),
43
+ platform: this.platform,
44
+ channelId: this.config.clientId,
45
+ userId: this.config.clientId,
46
+ content: data.content,
47
+ timestamp: Date.now(),
48
+ metadata: data.metadata,
49
+ };
50
+ this.emitMessage(message);
51
+ }
52
+ }
53
+ catch (err) {
54
+ logger.error("[WebSocket] Failed to parse message:", err);
55
+ }
56
+ };
57
+ this.client.onclose = () => {
58
+ logger.info("[WebSocket] Connection closed");
59
+ this.callbacks?.onDisconnect?.();
60
+ this.attemptReconnect(url, token);
61
+ };
62
+ this.client.onerror = (err) => {
63
+ logger.error("[WebSocket] Error:", err);
64
+ reject(err);
65
+ };
66
+ });
67
+ }
68
+ attemptReconnect(url, token) {
69
+ if (this.reconnectAttempts < this.maxReconnectAttempts) {
70
+ this.reconnectAttempts++;
71
+ const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
72
+ logger.info(`[WebSocket] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);
73
+ setTimeout(() => this.connect(url, token), delay);
74
+ }
75
+ }
76
+ async sendMessage(channelId, content) {
77
+ if (!this.client || this.client.readyState !== WebSocket.OPEN) {
78
+ throw new Error("WebSocket not connected");
79
+ }
80
+ const id = this.generateMessageId();
81
+ this.client.send(JSON.stringify({
82
+ type: "message",
83
+ id,
84
+ content,
85
+ channelId,
86
+ }));
87
+ return id;
88
+ }
89
+ async editMessage(channelId, messageId, content) {
90
+ if (!this.client || this.client.readyState !== WebSocket.OPEN) {
91
+ throw new Error("WebSocket not connected");
92
+ }
93
+ this.client.send(JSON.stringify({
94
+ type: "edit",
95
+ id: messageId,
96
+ content,
97
+ channelId,
98
+ }));
99
+ }
100
+ async deleteMessage(channelId, messageId) {
101
+ if (!this.client || this.client.readyState !== WebSocket.OPEN) {
102
+ throw new Error("WebSocket not connected");
103
+ }
104
+ this.client.send(JSON.stringify({
105
+ type: "delete",
106
+ id: messageId,
107
+ channelId,
108
+ }));
109
+ }
110
+ async setTyping(channelId, isTyping) {
111
+ if (!this.client || this.client.readyState !== WebSocket.OPEN)
112
+ return;
113
+ this.client.send(JSON.stringify({
114
+ type: "typing",
115
+ channelId,
116
+ isTyping,
117
+ }));
118
+ }
119
+ async getStatus() {
120
+ return {
121
+ connected: this.client?.readyState === WebSocket.OPEN,
122
+ };
123
+ }
124
+ async stop() {
125
+ if (this.client) {
126
+ this.client.close();
127
+ this.client = null;
128
+ }
129
+ await super.stop();
130
+ }
131
+ }
132
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/adapters/websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * WhatsApp Adapter - Hermes-style WhatsApp platform adapter
3
+ *
4
+ * Features:
5
+ * - WhatsApp Web protocol via Baileys
6
+ * - QR code authentication
7
+ * - Contact and group management
8
+ * - Media messaging
9
+ */
10
+ import { BaseAdapter, type PlatformConfig } from "./base.js";
11
+ export interface WhatsAppConfig extends PlatformConfig {
12
+ platform: "whatsapp";
13
+ sessionPath?: string;
14
+ printQr?: boolean;
15
+ maxMessageLength?: number;
16
+ }
17
+ interface WhatsAppContact {
18
+ id: string;
19
+ name?: string;
20
+ isGroup: boolean;
21
+ }
22
+ export declare class WhatsAppAdapter extends BaseAdapter {
23
+ readonly platform: "whatsapp";
24
+ config: WhatsAppConfig;
25
+ private sock;
26
+ private connected;
27
+ private qrCode;
28
+ constructor(config: WhatsAppConfig);
29
+ initialize(): Promise<void>;
30
+ private handleMessages;
31
+ start(callbacks: any): Promise<void>;
32
+ private sleep;
33
+ stop(): Promise<void>;
34
+ sendMessage(channelId: string, content: string): Promise<string>;
35
+ sendImage(channelId: string, imageUrl: string, caption?: string): Promise<string>;
36
+ sendReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
37
+ reply(channelId: string, content: string, messageId: string): Promise<string>;
38
+ editMessage(channelId: string, messageId: string, content: string): Promise<void>;
39
+ deleteMessage(channelId: string, messageId: string): Promise<void>;
40
+ setTyping(channelId: string, isTyping: boolean): Promise<void>;
41
+ getStatus(): Promise<{
42
+ connected: boolean;
43
+ latency?: number;
44
+ }>;
45
+ getContacts(): Promise<WhatsAppContact[]>;
46
+ getContact(jid: string): Promise<WhatsAppContact | null>;
47
+ getQrCode(): string | null;
48
+ }
49
+ export {};
@@ -0,0 +1,251 @@
1
+ /**
2
+ * WhatsApp Adapter - Hermes-style WhatsApp platform adapter
3
+ *
4
+ * Features:
5
+ * - WhatsApp Web protocol via Baileys
6
+ * - QR code authentication
7
+ * - Contact and group management
8
+ * - Media messaging
9
+ */
10
+ import { BaseAdapter } from "./base.js";
11
+ import { logger } from "../logger.js";
12
+ export class WhatsAppAdapter extends BaseAdapter {
13
+ platform = "whatsapp";
14
+ config;
15
+ sock = null;
16
+ connected = false;
17
+ qrCode = null;
18
+ constructor(config) {
19
+ super();
20
+ this.config = {
21
+ enabled: true,
22
+ platform: "whatsapp",
23
+ sessionPath: "./whatsapp-session",
24
+ printQr: true,
25
+ maxMessageLength: 4096,
26
+ ...config,
27
+ };
28
+ }
29
+ async initialize() {
30
+ try {
31
+ const baileys = await import("@whiskeysockets/baileys");
32
+ const { state, saveCreds } = await baileys.useMultiFileAuthState(this.config.sessionPath || "./whatsapp-session");
33
+ this.sock = baileys.makeWASocket({
34
+ auth: state,
35
+ printQRInTerminal: this.config.printQr,
36
+ defaultQueryTimeoutMs: 60 * 1000,
37
+ });
38
+ // Handle QR code
39
+ this.sock.ev.on("qr", (qr) => {
40
+ this.qrCode = qr;
41
+ logger.info("[WhatsApp] QR Code received - scan with WhatsApp app");
42
+ logger.info(qr);
43
+ });
44
+ // Handle connection update
45
+ this.sock.ev.on("connection.update", ({ qr, connection }) => {
46
+ if (qr) {
47
+ this.qrCode = qr;
48
+ }
49
+ if (connection === "open") {
50
+ this.connected = true;
51
+ this.qrCode = null;
52
+ logger.info("[WhatsApp] Connected!");
53
+ }
54
+ if (connection === "close") {
55
+ this.connected = false;
56
+ logger.info("[WhatsApp] Disconnected");
57
+ }
58
+ });
59
+ // Handle credentials update
60
+ this.sock.ev.on("creds.update", saveCreds);
61
+ // Handle messages
62
+ this.sock.ev.on("messages.upsert", ({ messages }) => {
63
+ this.handleMessages(messages);
64
+ });
65
+ logger.info("[WhatsApp] Initializing...");
66
+ }
67
+ catch (err) {
68
+ logger.error("[WhatsApp] Failed to initialize:", err);
69
+ throw err;
70
+ }
71
+ }
72
+ handleMessages(messages) {
73
+ for (const msg of messages) {
74
+ // Skip messages sent by us
75
+ if (msg.key.fromMe)
76
+ continue;
77
+ const jid = msg.key.remoteJid;
78
+ const isGroup = jid?.endsWith("@g.us");
79
+ // Get message content
80
+ const content = msg.message?.conversation ||
81
+ msg.message?.extendedTextMessage?.text ||
82
+ msg.message?.imageMessage?.caption ||
83
+ "";
84
+ if (!content)
85
+ continue;
86
+ const message = {
87
+ id: msg.key.id || this.generateMessageId(),
88
+ platform: "whatsapp",
89
+ channelId: jid,
90
+ userId: msg.key.participant || jid,
91
+ content,
92
+ timestamp: msg.messageTimestamp ? msg.messageTimestamp * 1000 : Date.now(),
93
+ metadata: {
94
+ isGroup,
95
+ messageType: msg.message ? Object.keys(msg.message)[0] : "unknown",
96
+ pushName: msg.pushName,
97
+ },
98
+ };
99
+ this.emitMessage(message);
100
+ }
101
+ }
102
+ async start(callbacks) {
103
+ await super.start(callbacks);
104
+ // Wait for connection
105
+ let attempts = 0;
106
+ while (!this.connected && attempts < 30) {
107
+ await this.sleep(1000);
108
+ attempts++;
109
+ }
110
+ if (!this.connected) {
111
+ logger.warn("[WhatsApp] Not yet connected - waiting for QR scan");
112
+ }
113
+ }
114
+ sleep(ms) {
115
+ return new Promise(resolve => setTimeout(resolve, ms));
116
+ }
117
+ async stop() {
118
+ if (this.sock) {
119
+ await this.sock.logout();
120
+ this.sock = null;
121
+ }
122
+ this.connected = false;
123
+ await super.stop();
124
+ }
125
+ async sendMessage(channelId, content) {
126
+ if (!this.sock || !this.connected) {
127
+ throw new Error("WhatsApp not connected");
128
+ }
129
+ // Truncate if too long
130
+ const text = content.length > (this.config.maxMessageLength || 4096)
131
+ ? content.slice(0, this.config.maxMessageLength - 3) + "..."
132
+ : content;
133
+ try {
134
+ const result = await this.sock.sendMessage(channelId, { text });
135
+ return result?.key?.id || this.generateMessageId();
136
+ }
137
+ catch (err) {
138
+ logger.error("[WhatsApp] Send error:", err);
139
+ throw err;
140
+ }
141
+ }
142
+ async sendImage(channelId, imageUrl, caption) {
143
+ if (!this.sock || !this.connected) {
144
+ throw new Error("WhatsApp not connected");
145
+ }
146
+ try {
147
+ const result = await this.sock.sendMessage(channelId, {
148
+ image: { url: imageUrl },
149
+ caption,
150
+ });
151
+ return result?.key?.id || this.generateMessageId();
152
+ }
153
+ catch (err) {
154
+ logger.error("[WhatsApp] Send image error:", err);
155
+ throw err;
156
+ }
157
+ }
158
+ async sendReaction(channelId, messageId, emoji) {
159
+ if (!this.sock || !this.connected) {
160
+ throw new Error("WhatsApp not connected");
161
+ }
162
+ try {
163
+ await this.sock.sendMessage(channelId, {
164
+ react: { text: emoji, key: { remoteJid: channelId, id: messageId } },
165
+ });
166
+ }
167
+ catch (err) {
168
+ logger.error("[WhatsApp] Reaction error:", err);
169
+ }
170
+ }
171
+ async reply(channelId, content, messageId) {
172
+ if (!this.sock || !this.connected) {
173
+ throw new Error("WhatsApp not connected");
174
+ }
175
+ try {
176
+ const result = await this.sock.sendMessage(channelId, {
177
+ text: content,
178
+ contextInfo: {
179
+ stanzaId: messageId,
180
+ remoteJid: channelId,
181
+ },
182
+ });
183
+ return result?.key?.id || this.generateMessageId();
184
+ }
185
+ catch (err) {
186
+ logger.error("[WhatsApp] Reply error:", err);
187
+ throw err;
188
+ }
189
+ }
190
+ async editMessage(channelId, messageId, content) {
191
+ if (!this.sock || !this.connected) {
192
+ throw new Error("WhatsApp not connected");
193
+ }
194
+ try {
195
+ await this.sock.relayMessage(channelId, {
196
+ protocolMessage: {
197
+ type: 6, // MESSAGE_EDIT
198
+ key: { remoteJid: channelId, id: messageId },
199
+ editedMessage: { conversation: [{ text: content }] },
200
+ },
201
+ }, {});
202
+ }
203
+ catch (err) {
204
+ logger.error("[WhatsApp] Edit error:", err);
205
+ }
206
+ }
207
+ async deleteMessage(channelId, messageId) {
208
+ if (!this.sock || !this.connected) {
209
+ throw new Error("WhatsApp not connected");
210
+ }
211
+ try {
212
+ await this.sock.sendMessage(channelId, {
213
+ delete: { remoteJid: channelId, id: messageId },
214
+ });
215
+ }
216
+ catch (err) {
217
+ logger.error("[WhatsApp] Delete error:", err);
218
+ }
219
+ }
220
+ async setTyping(channelId, isTyping) {
221
+ if (!this.sock || !this.connected)
222
+ return;
223
+ try {
224
+ await this.sock.sendPresenceUpdate(isTyping ? "composing" : "available", channelId);
225
+ }
226
+ catch (err) {
227
+ // Ignore presence errors
228
+ }
229
+ }
230
+ async getStatus() {
231
+ return { connected: this.connected };
232
+ }
233
+ async getContacts() {
234
+ if (!this.sock?.store?.contacts) {
235
+ return [];
236
+ }
237
+ return Object.entries(this.sock.store.contacts).map(([id, contact]) => ({
238
+ id,
239
+ name: contact?.name || contact?.notify || id.split("@")[0],
240
+ isGroup: id.endsWith("@g.us"),
241
+ }));
242
+ }
243
+ async getContact(jid) {
244
+ const contacts = await this.getContacts();
245
+ return contacts.find(c => c.id === jid) || null;
246
+ }
247
+ getQrCode() {
248
+ return this.qrCode;
249
+ }
250
+ }
251
+ //# sourceMappingURL=whatsapp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../src/adapters/whatsapp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAA6C,MAAM,WAAW,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAetC,MAAM,OAAO,eAAgB,SAAQ,WAAW;IACrC,QAAQ,GAAG,UAAmB,CAAC;IACxC,MAAM,CAAiB;IAEf,IAAI,GAAQ,IAAI,CAAC;IACjB,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,GAAkB,IAAI,CAAC;IAErC,YAAY,MAAsB;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE,IAAI;YACb,gBAAgB,EAAE,IAAI;YACtB,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YAExD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,oBAAoB,CAAC,CAAC;YAElH,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;gBAC/B,IAAI,EAAE,KAAK;gBACX,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBACtC,qBAAqB,EAAE,EAAE,GAAG,IAAI;aACjC,CAAC,CAAC;YAEH,iBAAiB;YACjB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAU,EAAE,EAAE;gBACnC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,2BAA2B;YAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAO,EAAE,EAAE;gBAC/D,IAAI,EAAE,EAAE,CAAC;oBACP,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACnB,CAAC;gBACD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;oBAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;oBACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;oBAC3B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,4BAA4B;YAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YAE3C,kBAAkB;YAClB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,QAAQ,EAAO,EAAE,EAAE;gBACvD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YACtD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,QAAe;QACpC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,2BAA2B;YAC3B,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM;gBAAE,SAAS;YAE7B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;YAC9B,MAAM,OAAO,GAAG,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEvC,sBAAsB;YACtB,MAAM,OAAO,GACX,GAAG,CAAC,OAAO,EAAE,YAAY;gBACzB,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI;gBACtC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO;gBAClC,EAAE,CAAC;YAEL,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,OAAO,GAAoB;gBAC/B,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBAC1C,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,GAAG;gBACd,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG;gBAClC,OAAO;gBACP,SAAS,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC1E,QAAQ,EAAE;oBACR,OAAO;oBACP,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;oBAClE,QAAQ,EAAE,GAAG,CAAC,QAAQ;iBACvB;aACF,CAAC;YAEF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAS;QACnB,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE7B,sBAAsB;QACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAe;QAClD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,uBAAuB;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC;YAClE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,KAAK;YAC5D,CAAC,CAAC,OAAO,CAAC;QAEZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,OAAO,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,QAAgB,EAAE,OAAgB;QACnE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;gBACpD,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE;gBACxB,OAAO;aACR,CAAC,CAAC;YACH,OAAO,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;YAClD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAa;QACpE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;gBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;aACrE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,OAAe,EAAE,SAAiB;QAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;gBACpD,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE;oBACX,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,SAAS;iBACrB;aACF,CAAC,CAAC;YACH,OAAO,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe;QACrE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;gBACtC,eAAe,EAAE;oBACf,IAAI,EAAE,CAAC,EAAE,eAAe;oBACxB,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;oBAC5C,aAAa,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;iBACrD;aACF,EAAE,EAAE,CAAC,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,SAAiB;QACtD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;gBACrC,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,QAAiB;QAClD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE1C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAgB,EAAE,EAAE,CAAC,CAAC;YACrF,EAAE;YACF,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC;IAClD,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export { initBackgroundTasks, startBackgroundTask, getPendingResultsForSession, markTaskDelivered, listTasks, cancelTask, type BackgroundTask, type BackgroundStatus } from "./manager.js";
@@ -0,0 +1,2 @@
1
+ export { initBackgroundTasks, startBackgroundTask, getPendingResultsForSession, markTaskDelivered, listTasks, cancelTask } from "./manager.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/background/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAA8C,MAAM,cAAc,CAAC"}
@@ -0,0 +1,70 @@
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
+ export type BackgroundStatus = "running" | "completed" | "failed" | "timeout" | "delivered";
12
+ export interface BackgroundTask {
13
+ id: string;
14
+ sessionId: string;
15
+ parentSessionId: string;
16
+ command: string;
17
+ status: BackgroundStatus;
18
+ progress: number;
19
+ progressMessage?: string;
20
+ result?: unknown;
21
+ error?: string;
22
+ createdAt: number;
23
+ startedAt?: number;
24
+ completedAt?: number;
25
+ deliveredAt?: number;
26
+ }
27
+ /**
28
+ * Initialize background tasks database
29
+ */
30
+ export declare function initBackgroundTasks(): Database.Database;
31
+ /**
32
+ * Start a background task
33
+ */
34
+ export declare function startBackgroundTask(parentSessionId: string, command: string, onProgress?: (task: BackgroundTask) => void): BackgroundTask;
35
+ /**
36
+ * Update task progress
37
+ */
38
+ export declare function updateTaskProgress(taskId: string, progress: number, message?: string): void;
39
+ /**
40
+ * Complete a task successfully
41
+ */
42
+ export declare function completeTask(taskId: string, result: unknown): void;
43
+ /**
44
+ * Fail a task
45
+ */
46
+ export declare function failTask(taskId: string, error: string): void;
47
+ /**
48
+ * Mark task as delivered to user
49
+ */
50
+ export declare function markTaskDelivered(taskId: string): void;
51
+ /**
52
+ * Get task by ID
53
+ */
54
+ export declare function getTask(taskId: string): BackgroundTask | null;
55
+ /**
56
+ * Get pending results for parent session
57
+ */
58
+ export declare function getPendingResultsForSession(parentSessionId: string): BackgroundTask[];
59
+ /**
60
+ * List all tasks
61
+ */
62
+ export declare function listTasks(status?: BackgroundStatus): BackgroundTask[];
63
+ /**
64
+ * Cancel a running task
65
+ */
66
+ export declare function cancelTask(taskId: string): boolean;
67
+ /**
68
+ * Clean up old tasks
69
+ */
70
+ export declare function cleanupOldTasks(maxAgeMs?: number): number;