@grovina/brian 0.1.0 → 0.1.1
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.
|
@@ -2,21 +2,18 @@ export class TelegramChannelAdapter {
|
|
|
2
2
|
token;
|
|
3
3
|
allowedUserId;
|
|
4
4
|
offset = 0;
|
|
5
|
+
history = new Map();
|
|
6
|
+
historyLimit = 200;
|
|
5
7
|
constructor(token, allowedUserId) {
|
|
6
8
|
this.token = token;
|
|
7
9
|
this.allowedUserId = allowedUserId;
|
|
8
10
|
}
|
|
9
11
|
async poll() {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
offset: this.offset,
|
|
15
|
-
timeout: 1,
|
|
16
|
-
allowed_updates: ['message'],
|
|
17
|
-
}),
|
|
12
|
+
const payload = await this.request('getUpdates', {
|
|
13
|
+
offset: this.offset,
|
|
14
|
+
timeout: 1,
|
|
15
|
+
allowed_updates: ['message'],
|
|
18
16
|
});
|
|
19
|
-
const payload = (await response.json());
|
|
20
17
|
if (!payload.ok)
|
|
21
18
|
return [];
|
|
22
19
|
const out = [];
|
|
@@ -27,6 +24,11 @@ export class TelegramChannelAdapter {
|
|
|
27
24
|
const chatId = String(message?.chat?.id ?? '');
|
|
28
25
|
if (!message?.text || !chatId || fromId !== this.allowedUserId)
|
|
29
26
|
continue;
|
|
27
|
+
this.recordHistory(chatId, {
|
|
28
|
+
ts: this.toIsoTimestamp(message.date),
|
|
29
|
+
userId: fromId,
|
|
30
|
+
text: message.text,
|
|
31
|
+
});
|
|
30
32
|
out.push({
|
|
31
33
|
eventId: `tg_${update.update_id}`,
|
|
32
34
|
channel: 'telegram',
|
|
@@ -44,30 +46,68 @@ export class TelegramChannelAdapter {
|
|
|
44
46
|
}
|
|
45
47
|
async sendReply(message, text) {
|
|
46
48
|
const chatId = message.replyContext?.chatId ?? message.conversationId;
|
|
47
|
-
await
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
const payload = await this.request('sendMessage', {
|
|
50
|
+
chat_id: chatId,
|
|
51
|
+
text,
|
|
52
|
+
reply_to_message_id: message.replyContext?.messageId
|
|
53
|
+
? Number(message.replyContext.messageId)
|
|
54
|
+
: undefined,
|
|
55
|
+
});
|
|
56
|
+
if (!payload.ok) {
|
|
57
|
+
throw new Error(payload.description ?? 'Telegram sendReply failed');
|
|
58
|
+
}
|
|
59
|
+
this.recordHistory(chatId, {
|
|
60
|
+
ts: this.toIsoTimestamp(payload.result?.date),
|
|
61
|
+
userId: 'bot',
|
|
62
|
+
text,
|
|
57
63
|
});
|
|
58
64
|
}
|
|
59
65
|
async sendToConversation(conversationId, text) {
|
|
60
|
-
await
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
body: JSON.stringify({
|
|
64
|
-
chat_id: conversationId,
|
|
65
|
-
text,
|
|
66
|
-
}),
|
|
66
|
+
const payload = await this.request('sendMessage', {
|
|
67
|
+
chat_id: conversationId,
|
|
68
|
+
text,
|
|
67
69
|
});
|
|
70
|
+
if (!payload.ok) {
|
|
71
|
+
throw new Error(payload.description ?? 'Telegram sendToConversation failed');
|
|
72
|
+
}
|
|
73
|
+
this.recordHistory(conversationId, {
|
|
74
|
+
ts: this.toIsoTimestamp(payload.result?.date),
|
|
75
|
+
userId: 'bot',
|
|
76
|
+
text,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async getHistory(conversationId, limit) {
|
|
80
|
+
const entries = this.history.get(conversationId) ?? [];
|
|
81
|
+
if (entries.length === 0)
|
|
82
|
+
return [];
|
|
83
|
+
return entries.slice(Math.max(0, entries.length - Math.max(1, limit)));
|
|
68
84
|
}
|
|
69
85
|
url(method) {
|
|
70
86
|
return `https://api.telegram.org/bot${this.token}/${method}`;
|
|
71
87
|
}
|
|
88
|
+
async request(method, body) {
|
|
89
|
+
const response = await fetch(this.url(method), {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
headers: { 'Content-Type': 'application/json' },
|
|
92
|
+
body: JSON.stringify(body),
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
throw new Error(`Telegram API ${method} failed with HTTP ${response.status}`);
|
|
96
|
+
}
|
|
97
|
+
return (await response.json());
|
|
98
|
+
}
|
|
99
|
+
toIsoTimestamp(unixSeconds) {
|
|
100
|
+
if (!unixSeconds)
|
|
101
|
+
return new Date().toISOString();
|
|
102
|
+
return new Date(unixSeconds * 1000).toISOString();
|
|
103
|
+
}
|
|
104
|
+
recordHistory(conversationId, entry) {
|
|
105
|
+
const current = this.history.get(conversationId) ?? [];
|
|
106
|
+
current.push(entry);
|
|
107
|
+
if (current.length > this.historyLimit) {
|
|
108
|
+
current.splice(0, current.length - this.historyLimit);
|
|
109
|
+
}
|
|
110
|
+
this.history.set(conversationId, current);
|
|
111
|
+
}
|
|
72
112
|
}
|
|
73
113
|
//# sourceMappingURL=telegram.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grovina/brian",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Brian runtime worker for Grovina agents",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/grovina/platform.git"
|
|
8
|
+
},
|
|
5
9
|
"license": "UNLICENSED",
|
|
6
10
|
"type": "module",
|
|
7
11
|
"publishConfig": {
|
package/dist/tools/process.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
const DEFAULT_DRAIN_MS = 100;
|
|
2
|
-
const FORCE_KILL_DELAY_MS = 5_000;
|
|
3
|
-
export function shellEnv(extraEnv) {
|
|
4
|
-
return {
|
|
5
|
-
...process.env,
|
|
6
|
-
...extraEnv,
|
|
7
|
-
PATH: `${process.env.HOME}/.npm-global/bin:${process.env.PATH}`,
|
|
8
|
-
CLOUDSDK_CORE_DISABLE_PROMPTS: process.env.CLOUDSDK_CORE_DISABLE_PROMPTS ?? '1',
|
|
9
|
-
CLOUDSDK_PAGER: process.env.CLOUDSDK_PAGER ?? '',
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
export function waitForProcessCompletion(proc, timeoutMs, drainMs = DEFAULT_DRAIN_MS) {
|
|
13
|
-
return new Promise((resolve) => {
|
|
14
|
-
let settled = false;
|
|
15
|
-
let timedOut = false;
|
|
16
|
-
let exitCode = null;
|
|
17
|
-
let signal = null;
|
|
18
|
-
let timeoutHandle = null;
|
|
19
|
-
let finalizeTimer = null;
|
|
20
|
-
const finish = () => {
|
|
21
|
-
if (settled)
|
|
22
|
-
return;
|
|
23
|
-
settled = true;
|
|
24
|
-
if (timeoutHandle)
|
|
25
|
-
clearTimeout(timeoutHandle);
|
|
26
|
-
if (finalizeTimer)
|
|
27
|
-
clearTimeout(finalizeTimer);
|
|
28
|
-
resolve({ exitCode, signal, timedOut });
|
|
29
|
-
};
|
|
30
|
-
if (timeoutMs > 0) {
|
|
31
|
-
timeoutHandle = setTimeout(() => {
|
|
32
|
-
timedOut = true;
|
|
33
|
-
proc.kill('SIGTERM');
|
|
34
|
-
setTimeout(() => {
|
|
35
|
-
if (proc.exitCode === null) {
|
|
36
|
-
proc.kill('SIGKILL');
|
|
37
|
-
}
|
|
38
|
-
}, FORCE_KILL_DELAY_MS);
|
|
39
|
-
}, timeoutMs);
|
|
40
|
-
}
|
|
41
|
-
proc.on('exit', (code, exitSignal) => {
|
|
42
|
-
exitCode = code;
|
|
43
|
-
signal = exitSignal;
|
|
44
|
-
if (finalizeTimer)
|
|
45
|
-
clearTimeout(finalizeTimer);
|
|
46
|
-
finalizeTimer = setTimeout(finish, Math.max(0, drainMs));
|
|
47
|
-
});
|
|
48
|
-
proc.on('close', (code, closeSignal) => {
|
|
49
|
-
if (exitCode === null)
|
|
50
|
-
exitCode = code;
|
|
51
|
-
if (signal === null)
|
|
52
|
-
signal = closeSignal;
|
|
53
|
-
finish();
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=process.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/tools/process.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAQlC,MAAM,UAAU,QAAQ,CAAC,QAAiC;IACxD,OAAO;QACL,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,QAAQ;QACX,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,oBAAoB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;QAC/D,6BAA6B,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,GAAG;QAC/E,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,IAAoC,EACpC,SAAiB,EACjB,OAAO,GAAG,gBAAgB;IAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,MAAM,GAA0B,IAAI,CAAC;QACzC,IAAI,aAAa,GAA0B,IAAI,CAAC;QAChD,IAAI,aAAa,GAA0B,IAAI,CAAC;QAEhD,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC;QAEF,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;wBAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC,EAAE,mBAAmB,CAAC,CAAC;YAC1B,CAAC,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE;YACnC,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,GAAG,UAAU,CAAC;YACpB,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;YACrC,IAAI,QAAQ,KAAK,IAAI;gBAAE,QAAQ,GAAG,IAAI,CAAC;YACvC,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,GAAG,WAAW,CAAC;YAC1C,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|