beecork 0.1.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 (118) hide show
  1. package/dist/cli/commands.d.ts +14 -0
  2. package/dist/cli/commands.d.ts.map +1 -0
  3. package/dist/cli/commands.js +215 -0
  4. package/dist/cli/commands.js.map +1 -0
  5. package/dist/cli/helpers.d.ts +4 -0
  6. package/dist/cli/helpers.d.ts.map +1 -0
  7. package/dist/cli/helpers.js +46 -0
  8. package/dist/cli/helpers.js.map +1 -0
  9. package/dist/cli/setup.d.ts +2 -0
  10. package/dist/cli/setup.d.ts.map +1 -0
  11. package/dist/cli/setup.js +145 -0
  12. package/dist/cli/setup.js.map +1 -0
  13. package/dist/config.d.ts +9 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +97 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/cron/scheduler.d.ts +20 -0
  18. package/dist/cron/scheduler.d.ts.map +1 -0
  19. package/dist/cron/scheduler.js +151 -0
  20. package/dist/cron/scheduler.js.map +1 -0
  21. package/dist/cron/store.d.ts +12 -0
  22. package/dist/cron/store.d.ts.map +1 -0
  23. package/dist/cron/store.js +82 -0
  24. package/dist/cron/store.js.map +1 -0
  25. package/dist/daemon.d.ts +2 -0
  26. package/dist/daemon.d.ts.map +1 -0
  27. package/dist/daemon.js +140 -0
  28. package/dist/daemon.js.map +1 -0
  29. package/dist/db/index.d.ts +4 -0
  30. package/dist/db/index.d.ts.map +1 -0
  31. package/dist/db/index.js +66 -0
  32. package/dist/db/index.js.map +1 -0
  33. package/dist/db/migrations.d.ts +3 -0
  34. package/dist/db/migrations.d.ts.map +1 -0
  35. package/dist/db/migrations.js +85 -0
  36. package/dist/db/migrations.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +66 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/mcp/server.d.ts +3 -0
  42. package/dist/mcp/server.d.ts.map +1 -0
  43. package/dist/mcp/server.js +304 -0
  44. package/dist/mcp/server.js.map +1 -0
  45. package/dist/memory/extractor.d.ts +6 -0
  46. package/dist/memory/extractor.d.ts.map +1 -0
  47. package/dist/memory/extractor.js +105 -0
  48. package/dist/memory/extractor.js.map +1 -0
  49. package/dist/service/install.d.ts +5 -0
  50. package/dist/service/install.d.ts.map +1 -0
  51. package/dist/service/install.js +118 -0
  52. package/dist/service/install.js.map +1 -0
  53. package/dist/service/templates.d.ts +5 -0
  54. package/dist/service/templates.d.ts.map +1 -0
  55. package/dist/service/templates.js +53 -0
  56. package/dist/service/templates.js.map +1 -0
  57. package/dist/session/approval.d.ts +20 -0
  58. package/dist/session/approval.d.ts.map +1 -0
  59. package/dist/session/approval.js +59 -0
  60. package/dist/session/approval.js.map +1 -0
  61. package/dist/session/circuit-breaker.d.ts +18 -0
  62. package/dist/session/circuit-breaker.d.ts.map +1 -0
  63. package/dist/session/circuit-breaker.js +67 -0
  64. package/dist/session/circuit-breaker.js.map +1 -0
  65. package/dist/session/context-monitor.d.ts +16 -0
  66. package/dist/session/context-monitor.d.ts.map +1 -0
  67. package/dist/session/context-monitor.js +44 -0
  68. package/dist/session/context-monitor.js.map +1 -0
  69. package/dist/session/manager.d.ts +42 -0
  70. package/dist/session/manager.d.ts.map +1 -0
  71. package/dist/session/manager.js +291 -0
  72. package/dist/session/manager.js.map +1 -0
  73. package/dist/session/subprocess.d.ts +23 -0
  74. package/dist/session/subprocess.d.ts.map +1 -0
  75. package/dist/session/subprocess.js +119 -0
  76. package/dist/session/subprocess.js.map +1 -0
  77. package/dist/session/tool-classifier.d.ts +4 -0
  78. package/dist/session/tool-classifier.d.ts.map +1 -0
  79. package/dist/session/tool-classifier.js +57 -0
  80. package/dist/session/tool-classifier.js.map +1 -0
  81. package/dist/telegram/bot.d.ts +25 -0
  82. package/dist/telegram/bot.d.ts.map +1 -0
  83. package/dist/telegram/bot.js +293 -0
  84. package/dist/telegram/bot.js.map +1 -0
  85. package/dist/telegram/formatter.d.ts +11 -0
  86. package/dist/telegram/formatter.d.ts.map +1 -0
  87. package/dist/telegram/formatter.js +54 -0
  88. package/dist/telegram/formatter.js.map +1 -0
  89. package/dist/types.d.ts +131 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +3 -0
  92. package/dist/types.js.map +1 -0
  93. package/dist/util/logger.d.ts +17 -0
  94. package/dist/util/logger.d.ts.map +1 -0
  95. package/dist/util/logger.js +56 -0
  96. package/dist/util/logger.js.map +1 -0
  97. package/dist/util/paths.d.ts +11 -0
  98. package/dist/util/paths.d.ts.map +1 -0
  99. package/dist/util/paths.js +40 -0
  100. package/dist/util/paths.js.map +1 -0
  101. package/dist/util/platform.d.ts +3 -0
  102. package/dist/util/platform.d.ts.map +1 -0
  103. package/dist/util/platform.js +10 -0
  104. package/dist/util/platform.js.map +1 -0
  105. package/dist/util/retry.d.ts +3 -0
  106. package/dist/util/retry.d.ts.map +1 -0
  107. package/dist/util/retry.js +19 -0
  108. package/dist/util/retry.js.map +1 -0
  109. package/dist/whatsapp/client.d.ts +23 -0
  110. package/dist/whatsapp/client.d.ts.map +1 -0
  111. package/dist/whatsapp/client.js +125 -0
  112. package/dist/whatsapp/client.js.map +1 -0
  113. package/dist/whatsapp/formatter.d.ts +3 -0
  114. package/dist/whatsapp/formatter.d.ts.map +1 -0
  115. package/dist/whatsapp/formatter.js +25 -0
  116. package/dist/whatsapp/formatter.js.map +1 -0
  117. package/package.json +53 -0
  118. package/templates/CLAUDE.md +25 -0
@@ -0,0 +1,40 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import fs from 'node:fs';
4
+ const BEECORK_DIR = '.beecork';
5
+ export function getBeecorkHome() {
6
+ return path.join(os.homedir(), BEECORK_DIR);
7
+ }
8
+ export function getConfigPath() {
9
+ return path.join(getBeecorkHome(), 'config.json');
10
+ }
11
+ export function getDbPath() {
12
+ return path.join(getBeecorkHome(), 'memory.db');
13
+ }
14
+ export function getCrontabPath() {
15
+ return path.join(getBeecorkHome(), 'crontab.json');
16
+ }
17
+ export function getMcpConfigPath() {
18
+ return path.join(getBeecorkHome(), 'mcp-config.json');
19
+ }
20
+ export function getLogsDir() {
21
+ return path.join(getBeecorkHome(), 'logs');
22
+ }
23
+ export function getPidPath() {
24
+ return path.join(getBeecorkHome(), 'beecork.pid');
25
+ }
26
+ export function getCronReloadSignalPath() {
27
+ return path.join(getBeecorkHome(), '.cron-reload');
28
+ }
29
+ export function ensureBeecorkDirs() {
30
+ const home = getBeecorkHome();
31
+ fs.mkdirSync(home, { recursive: true });
32
+ fs.mkdirSync(getLogsDir(), { recursive: true });
33
+ }
34
+ export function expandHome(p) {
35
+ if (p.startsWith('~/') || p === '~') {
36
+ return path.join(os.homedir(), p.slice(1));
37
+ }
38
+ return p;
39
+ }
40
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,WAAW,GAAG,UAAU,CAAC;AAE/B,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type Platform = 'mac' | 'linux';
2
+ export declare function getPlatform(): Platform;
3
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/util/platform.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvC,wBAAgB,WAAW,IAAI,QAAQ,CAKtC"}
@@ -0,0 +1,10 @@
1
+ import os from 'node:os';
2
+ export function getPlatform() {
3
+ const p = os.platform();
4
+ if (p === 'darwin')
5
+ return 'mac';
6
+ if (p === 'linux')
7
+ return 'linux';
8
+ throw new Error(`Unsupported platform: ${p}. Beecork supports Mac and Linux.`);
9
+ }
10
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/util/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAIzB,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAClC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,mCAAmC,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Retry a function with exponential backoff */
2
+ export declare function retryWithBackoff<T>(fn: () => Promise<T>, delays?: number[], label?: string): Promise<T>;
3
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/util/retry.ts"],"names":[],"mappings":"AAEA,gDAAgD;AAChD,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,GAAE,MAAM,EAAwB,EACtC,KAAK,GAAE,MAAoB,GAC1B,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
@@ -0,0 +1,19 @@
1
+ import { logger } from './logger.js';
2
+ /** Retry a function with exponential backoff */
3
+ export async function retryWithBackoff(fn, delays = [1000, 5000, 15000], label = 'operation') {
4
+ let lastError;
5
+ for (let attempt = 0; attempt <= delays.length; attempt++) {
6
+ try {
7
+ return await fn();
8
+ }
9
+ catch (err) {
10
+ lastError = err instanceof Error ? err : new Error(String(err));
11
+ if (attempt < delays.length) {
12
+ logger.warn(`${label} failed (attempt ${attempt + 1}/${delays.length + 1}), retrying in ${delays[attempt]}ms: ${lastError.message}`);
13
+ await new Promise(resolve => setTimeout(resolve, delays[attempt]));
14
+ }
15
+ }
16
+ }
17
+ throw lastError;
18
+ }
19
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/util/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAoB,EACpB,SAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EACtC,QAAgB,WAAW;IAE3B,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,oBAAoB,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrI,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAU,CAAC;AACnB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { TabManager } from '../session/manager.js';
2
+ import type { BeecorkConfig } from '../types.js';
3
+ /**
4
+ * WhatsApp client via Baileys.
5
+ * Uses @whiskeysockets/baileys for reverse-engineered WhatsApp Web connection.
6
+ * Session is persisted in ~/.beecork/whatsapp-session/
7
+ *
8
+ * NOTE: This violates WhatsApp ToS. For personal use only.
9
+ */
10
+ export declare class BeecorkWhatsAppClient {
11
+ private sock;
12
+ private tabManager;
13
+ private config;
14
+ private allowedNumbers;
15
+ constructor(config: BeecorkConfig, tabManager: TabManager);
16
+ start(): Promise<void>;
17
+ private parseMessage;
18
+ sendResponse(jid: string, text: string, tabName?: string): Promise<void>;
19
+ sendNotification(text: string): Promise<void>;
20
+ stop(): void;
21
+ private isAllowed;
22
+ }
23
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/whatsapp/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAc;gBAExB,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU;IAMnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+D5B,OAAO,CAAC,YAAY;IAUd,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxE,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnD,IAAI,IAAI,IAAI;IASZ,OAAO,CAAC,SAAS;CAKlB"}
@@ -0,0 +1,125 @@
1
+ import { logger } from '../util/logger.js';
2
+ import { chunkTextWA } from './formatter.js';
3
+ /**
4
+ * WhatsApp client via Baileys.
5
+ * Uses @whiskeysockets/baileys for reverse-engineered WhatsApp Web connection.
6
+ * Session is persisted in ~/.beecork/whatsapp-session/
7
+ *
8
+ * NOTE: This violates WhatsApp ToS. For personal use only.
9
+ */
10
+ export class BeecorkWhatsAppClient {
11
+ sock = null;
12
+ tabManager;
13
+ config;
14
+ allowedNumbers;
15
+ constructor(config, tabManager) {
16
+ this.config = config;
17
+ this.tabManager = tabManager;
18
+ this.allowedNumbers = new Set(config.whatsapp?.allowedNumbers ?? []);
19
+ }
20
+ async start() {
21
+ try {
22
+ // Dynamic import since baileys might not be installed
23
+ const { default: makeWASocket, useMultiFileAuthState, DisconnectReason } = await import('@whiskeysockets/baileys');
24
+ const sessionPath = this.config.whatsapp?.sessionPath ?? `${process.env.HOME}/.beecork/whatsapp-session`;
25
+ const { state, saveCreds } = await useMultiFileAuthState(sessionPath);
26
+ this.sock = makeWASocket({
27
+ auth: state,
28
+ printQRInTerminal: true,
29
+ });
30
+ const sock = this.sock;
31
+ sock.ev.on('creds.update', saveCreds);
32
+ sock.ev.on('connection.update', (update) => {
33
+ const { connection, lastDisconnect } = update;
34
+ if (connection === 'close') {
35
+ const reason = lastDisconnect?.error?.output?.statusCode;
36
+ if (reason !== DisconnectReason.loggedOut) {
37
+ logger.warn('WhatsApp connection closed, reconnecting...');
38
+ this.start(); // Reconnect
39
+ }
40
+ else {
41
+ logger.error('WhatsApp logged out. Please re-scan QR code.');
42
+ }
43
+ }
44
+ else if (connection === 'open') {
45
+ logger.info('WhatsApp connected');
46
+ }
47
+ });
48
+ sock.ev.on('messages.upsert', async (m) => {
49
+ const msg = m.messages[0];
50
+ if (!msg?.message || msg.key.fromMe)
51
+ return;
52
+ const sender = msg.key.remoteJid;
53
+ if (!sender || !this.isAllowed(sender))
54
+ return;
55
+ const text = msg.message.conversation ||
56
+ msg.message.extendedTextMessage?.text || '';
57
+ if (!text)
58
+ return;
59
+ try {
60
+ const { tabName, prompt } = this.parseMessage(text);
61
+ if (!prompt)
62
+ return;
63
+ const result = await this.tabManager.sendMessage(tabName, prompt);
64
+ const responseText = result.error
65
+ ? `Error: ${result.text}`
66
+ : result.text || '(empty response)';
67
+ await this.sendResponse(sender, responseText, tabName);
68
+ }
69
+ catch (err) {
70
+ logger.error('WhatsApp message handler error:', err);
71
+ }
72
+ });
73
+ }
74
+ catch (err) {
75
+ logger.error('Failed to start WhatsApp client:', err);
76
+ throw err;
77
+ }
78
+ }
79
+ parseMessage(text) {
80
+ if (text.startsWith('/tab ')) {
81
+ const rest = text.slice(5);
82
+ const spaceIdx = rest.indexOf(' ');
83
+ if (spaceIdx === -1)
84
+ return { tabName: rest, prompt: '' };
85
+ return { tabName: rest.slice(0, spaceIdx), prompt: rest.slice(spaceIdx + 1).trim() };
86
+ }
87
+ return { tabName: 'default', prompt: text };
88
+ }
89
+ async sendResponse(jid, text, tabName) {
90
+ const prefix = tabName && tabName !== 'default' ? `[${tabName}] ` : '';
91
+ const chunks = chunkTextWA(prefix + text);
92
+ const sock = this.sock;
93
+ for (const chunk of chunks) {
94
+ await sock.sendMessage(jid, { text: chunk });
95
+ }
96
+ }
97
+ async sendNotification(text) {
98
+ const sock = this.sock;
99
+ if (!sock)
100
+ return;
101
+ for (const number of this.allowedNumbers) {
102
+ try {
103
+ await sock.sendMessage(`${number}@s.whatsapp.net`, { text });
104
+ }
105
+ catch (err) {
106
+ logger.error(`Failed to send WhatsApp notification to ${number}:`, err);
107
+ }
108
+ }
109
+ }
110
+ stop() {
111
+ const sock = this.sock;
112
+ if (sock) {
113
+ sock.end(undefined);
114
+ this.sock = null;
115
+ }
116
+ logger.info('WhatsApp client stopped');
117
+ }
118
+ isAllowed(jid) {
119
+ if (this.allowedNumbers.size === 0)
120
+ return true; // No filter = allow all
121
+ const number = jid.replace('@s.whatsapp.net', '');
122
+ return this.allowedNumbers.has(number);
123
+ }
124
+ }
125
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/whatsapp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Split long text into chunks for WhatsApp */
2
+ export declare function chunkTextWA(text: string, maxLength?: number): string[];
3
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/whatsapp/formatter.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAA4B,GAAG,MAAM,EAAE,CAyB3F"}
@@ -0,0 +1,25 @@
1
+ const WHATSAPP_MAX_LENGTH = 4096;
2
+ /** Split long text into chunks for WhatsApp */
3
+ export function chunkTextWA(text, maxLength = WHATSAPP_MAX_LENGTH) {
4
+ if (text.length <= maxLength)
5
+ return [text];
6
+ const chunks = [];
7
+ let remaining = text;
8
+ while (remaining.length > 0) {
9
+ if (remaining.length <= maxLength) {
10
+ chunks.push(remaining);
11
+ break;
12
+ }
13
+ let breakPoint = remaining.lastIndexOf('\n', maxLength);
14
+ if (breakPoint <= 0 || breakPoint < maxLength * 0.5) {
15
+ breakPoint = remaining.lastIndexOf(' ', maxLength);
16
+ }
17
+ if (breakPoint <= 0 || breakPoint < maxLength * 0.5) {
18
+ breakPoint = maxLength;
19
+ }
20
+ chunks.push(remaining.slice(0, breakPoint));
21
+ remaining = remaining.slice(breakPoint).trimStart();
22
+ }
23
+ return chunks;
24
+ }
25
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/whatsapp/formatter.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,YAAoB,mBAAmB;IAC/E,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QAED,IAAI,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;YACpD,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;YACpD,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;QAC5C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "beecork",
3
+ "version": "0.1.0",
4
+ "description": "Claude Code always-on infrastructure — a phone number, a memory, and an alarm clock",
5
+ "type": "module",
6
+ "bin": {
7
+ "beecork": "dist/index.js"
8
+ },
9
+ "engines": {
10
+ "node": ">=18"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc -p tsconfig.build.json",
14
+ "dev": "tsx src/index.ts",
15
+ "dev:daemon": "tsx src/daemon.ts",
16
+ "test": "vitest",
17
+ "lint": "eslint src/",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "dependencies": {
21
+ "@anthropic-ai/claude-code": "^2.1.0",
22
+ "@modelcontextprotocol/sdk": "^1.28.0",
23
+ "better-sqlite3": "^12.8.0",
24
+ "commander": "^13.0.0",
25
+ "node-cron": "^4.0.0",
26
+ "node-telegram-bot-api": "^0.67.0",
27
+ "uuid": "^11.0.0",
28
+ "@whiskeysockets/baileys": "^6.7.0",
29
+ "qrcode-terminal": "^0.12.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/better-sqlite3": "^7.6.0",
33
+ "@types/node": "^22.0.0",
34
+ "@types/node-cron": "^3.0.0",
35
+ "@types/node-telegram-bot-api": "^0.64.0",
36
+ "@types/uuid": "^10.0.0",
37
+ "tsx": "^4.0.0",
38
+ "typescript": "^5.7.0",
39
+ "vitest": "^3.0.0"
40
+ },
41
+ "files": [
42
+ "dist/",
43
+ "templates/"
44
+ ],
45
+ "keywords": [
46
+ "claude",
47
+ "claude-code",
48
+ "telegram",
49
+ "automation",
50
+ "cron"
51
+ ],
52
+ "license": "MIT"
53
+ }
@@ -0,0 +1,25 @@
1
+ # Beecork Context
2
+
3
+ You are running inside Beecork, an always-on infrastructure for Claude Code.
4
+
5
+ ## Available Beecork Tools (via MCP)
6
+
7
+ - **beecork_remember** — Store important facts in long-term memory. Use for preferences, server addresses, decisions, outcomes.
8
+ - **beecork_recall** — Search long-term memory for relevant facts from past sessions. Call this at the start of complex tasks.
9
+ - **beecork_cron_create** — Schedule a recurring task. Types: "at" (one-time ISO datetime), "every" (interval like "30m", "2h", "1d"), "cron" (cron expression like "0 9 * * 1").
10
+ - **beecork_cron_list** — See all scheduled tasks.
11
+ - **beecork_cron_delete** — Remove a scheduled task by ID.
12
+ - **beecork_tab_create** — Create a new virtual tab for a separate task context.
13
+ - **beecork_tab_list** — See all active tabs and their status.
14
+ - **beecork_send_message** — Send a message to another tab (cross-tab communication).
15
+ - **beecork_notify** — Send the user a notification mid-task without stopping work. Use for progress updates or intermediate results.
16
+ - **beecork_status** — Check system status: active tabs, cron jobs, memory count.
17
+
18
+ ## Guidelines
19
+
20
+ - You are running unattended. The user may not be watching. Be thorough and complete tasks fully.
21
+ - Always call `beecork_recall` at the start of any task to check relevant memories.
22
+ - Always call `beecork_remember` when you learn something important about the user's setup, preferences, or environment.
23
+ - When asked to do something recurring, use `beecork_cron_create` instead of reminding the user to ask again.
24
+ - Use `beecork_notify` to send the user progress updates during long-running tasks.
25
+ - If a task is too large for one session, break it into steps and use `beecork_cron_create` to schedule follow-ups.