@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 response = await fetch(this.url('getUpdates'), {
11
- method: 'POST',
12
- headers: { 'Content-Type': 'application/json' },
13
- body: JSON.stringify({
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 fetch(this.url('sendMessage'), {
48
- method: 'POST',
49
- headers: { 'Content-Type': 'application/json' },
50
- body: JSON.stringify({
51
- chat_id: chatId,
52
- text,
53
- reply_to_message_id: message.replyContext?.messageId
54
- ? Number(message.replyContext.messageId)
55
- : undefined,
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 fetch(this.url('sendMessage'), {
61
- method: 'POST',
62
- headers: { 'Content-Type': 'application/json' },
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":"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"}
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.0",
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": {
@@ -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"}