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
package/dist/index.js ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { setupWizard } from './cli/setup.js';
4
+ import { startDaemon, stopDaemon, showStatus, listTabs, tailLogs, listCrons, deleteCron, listMemories, deleteMemory, sendMessage, updateBeecork, } from './cli/commands.js';
5
+ const program = new Command();
6
+ program
7
+ .name('beecork')
8
+ .version('0.1.0')
9
+ .description('Claude Code always-on infrastructure — a phone number, a memory, and an alarm clock');
10
+ program
11
+ .command('setup')
12
+ .description('First-time setup wizard')
13
+ .action(setupWizard);
14
+ program
15
+ .command('start')
16
+ .description('Start the Beecork daemon')
17
+ .action(startDaemon);
18
+ program
19
+ .command('stop')
20
+ .description('Stop the Beecork daemon')
21
+ .action(stopDaemon);
22
+ program
23
+ .command('status')
24
+ .description('Show daemon status, running tabs, and cron jobs')
25
+ .action(showStatus);
26
+ program
27
+ .command('tabs')
28
+ .description('List all virtual tabs')
29
+ .action(listTabs);
30
+ program
31
+ .command('logs [tab]')
32
+ .description('Tail logs for a tab (default: daemon logs)')
33
+ .action(tailLogs);
34
+ const cronCmd = program
35
+ .command('cron')
36
+ .description('Manage cron jobs');
37
+ cronCmd
38
+ .command('list')
39
+ .description('List all cron jobs')
40
+ .action(listCrons);
41
+ cronCmd
42
+ .command('delete <id>')
43
+ .description('Delete a cron job by ID')
44
+ .action(deleteCron);
45
+ const memoryCmd = program
46
+ .command('memory')
47
+ .description('Manage long-term memories');
48
+ memoryCmd
49
+ .command('list')
50
+ .description('List stored memories')
51
+ .action(listMemories);
52
+ memoryCmd
53
+ .command('delete <id>')
54
+ .description('Delete a memory by ID')
55
+ .action(deleteMemory);
56
+ program
57
+ .command('send <message>')
58
+ .description('Send a message to the default tab (for testing)')
59
+ .action(sendMessage);
60
+ program
61
+ .command('update')
62
+ .description('Update beecork to the latest version')
63
+ .option('--check', 'Check for updates without installing')
64
+ .action(updateBeecork);
65
+ program.parse();
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qFAAqF,CAAC,CAAC;AAEtG,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpB,MAAM,OAAO,GAAG,OAAO;KACpB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kBAAkB,CAAC,CAAC;AAEnC,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,SAAS,CAAC,CAAC;AAErB,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,MAAM,SAAS,GAAG,OAAO;KACtB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2BAA2B,CAAC,CAAC;AAE5C,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,SAAS;KACN,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;KACzD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,304 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { v4 as uuidv4 } from 'uuid';
6
+ import Database from 'better-sqlite3';
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import os from 'node:os';
10
+ // MCP server runs as a child of `claude`, not the Beecork daemon.
11
+ // It communicates with the daemon via shared SQLite + signal files.
12
+ const BEECORK_HOME = process.env.BEECORK_HOME || path.join(os.homedir(), '.beecork');
13
+ const DB_PATH = path.join(BEECORK_HOME, 'memory.db');
14
+ const CRONTAB_PATH = path.join(BEECORK_HOME, 'crontab.json');
15
+ const CRON_RELOAD_SIGNAL = path.join(BEECORK_HOME, '.cron-reload');
16
+ function getDb() {
17
+ const db = new Database(DB_PATH);
18
+ db.pragma('journal_mode = WAL');
19
+ db.pragma('foreign_keys = ON');
20
+ return db;
21
+ }
22
+ function loadCrontab() {
23
+ if (!fs.existsSync(CRONTAB_PATH)) {
24
+ return { jobs: [] };
25
+ }
26
+ return JSON.parse(fs.readFileSync(CRONTAB_PATH, 'utf-8'));
27
+ }
28
+ function saveCrontab(data) {
29
+ fs.writeFileSync(CRONTAB_PATH, JSON.stringify(data, null, 2) + '\n');
30
+ // Signal the daemon to reload cron schedules
31
+ fs.writeFileSync(CRON_RELOAD_SIGNAL, String(Date.now()));
32
+ }
33
+ const server = new Server({ name: 'beecork', version: '0.1.0' }, { capabilities: { tools: {} } });
34
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
35
+ tools: [
36
+ {
37
+ name: 'beecork_remember',
38
+ description: 'Store a fact in Beecork\'s long-term memory. Use this for preferences, decisions, server addresses, outcomes, or anything the user might want recalled in future sessions.',
39
+ inputSchema: {
40
+ type: 'object',
41
+ properties: {
42
+ content: { type: 'string', description: 'The fact or information to remember' },
43
+ },
44
+ required: ['content'],
45
+ },
46
+ },
47
+ {
48
+ name: 'beecork_cron_create',
49
+ description: 'Schedule a task that will run automatically. The task sends a message to a Beecork tab at the scheduled time.',
50
+ inputSchema: {
51
+ type: 'object',
52
+ properties: {
53
+ name: { type: 'string', description: 'Human-readable name for the job' },
54
+ scheduleType: {
55
+ type: 'string',
56
+ enum: ['at', 'every', 'cron'],
57
+ description: '"at" = one-time ISO datetime, "every" = interval like "30m"/"2h"/"1d", "cron" = cron expression like "0 9 * * 1"',
58
+ },
59
+ schedule: { type: 'string', description: 'The schedule value (ISO datetime, interval, or cron expression)' },
60
+ message: { type: 'string', description: 'The prompt/message to send when the job fires' },
61
+ tabName: { type: 'string', description: 'Which tab to send the message to (default: "default")' },
62
+ },
63
+ required: ['name', 'scheduleType', 'schedule', 'message'],
64
+ },
65
+ },
66
+ {
67
+ name: 'beecork_cron_list',
68
+ description: 'List all scheduled cron jobs.',
69
+ inputSchema: {
70
+ type: 'object',
71
+ properties: {},
72
+ },
73
+ },
74
+ {
75
+ name: 'beecork_cron_delete',
76
+ description: 'Delete a scheduled cron job by ID.',
77
+ inputSchema: {
78
+ type: 'object',
79
+ properties: {
80
+ id: { type: 'string', description: 'The ID of the cron job to delete' },
81
+ },
82
+ required: ['id'],
83
+ },
84
+ },
85
+ {
86
+ name: 'beecork_tab_create',
87
+ description: 'Create a new virtual tab for a separate task context.',
88
+ inputSchema: {
89
+ type: 'object',
90
+ properties: {
91
+ name: { type: 'string', description: 'Name for the new tab' },
92
+ workingDir: { type: 'string', description: 'Working directory for the tab (default: ~/)' },
93
+ },
94
+ required: ['name'],
95
+ },
96
+ },
97
+ {
98
+ name: 'beecork_tab_list',
99
+ description: 'List all virtual tabs and their current status.',
100
+ inputSchema: {
101
+ type: 'object',
102
+ properties: {},
103
+ },
104
+ },
105
+ {
106
+ name: 'beecork_send_message',
107
+ description: 'Send a message to another tab. The message will be processed as if a user sent it.',
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ tabName: { type: 'string', description: 'Name of the tab to send the message to' },
112
+ message: { type: 'string', description: 'The message/prompt to send' },
113
+ },
114
+ required: ['tabName', 'message'],
115
+ },
116
+ },
117
+ {
118
+ name: 'beecork_recall',
119
+ description: 'Search long-term memory for relevant facts, decisions, or outcomes from past sessions.',
120
+ inputSchema: {
121
+ type: 'object',
122
+ properties: {
123
+ query: { type: 'string', description: 'Search term to find relevant memories' },
124
+ limit: { type: 'number', description: 'Max results to return (default: 10)' },
125
+ },
126
+ required: ['query'],
127
+ },
128
+ },
129
+ {
130
+ name: 'beecork_notify',
131
+ description: 'Send a notification to the user mid-task without ending the session. Use for progress updates, questions, or intermediate results.',
132
+ inputSchema: {
133
+ type: 'object',
134
+ properties: {
135
+ message: { type: 'string', description: 'The notification message to send' },
136
+ },
137
+ required: ['message'],
138
+ },
139
+ },
140
+ {
141
+ name: 'beecork_status',
142
+ description: 'Get current Beecork system status: active tabs, cron jobs, uptime.',
143
+ inputSchema: {
144
+ type: 'object',
145
+ properties: {},
146
+ },
147
+ },
148
+ ],
149
+ }));
150
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
151
+ const { name, arguments: args } = request.params;
152
+ switch (name) {
153
+ case 'beecork_remember': {
154
+ const content = args.content;
155
+ const db = getDb();
156
+ try {
157
+ db.prepare('INSERT INTO memories (content, source) VALUES (?, ?)').run(content, 'tool');
158
+ return { content: [{ type: 'text', text: `Remembered: "${content}"` }] };
159
+ }
160
+ finally {
161
+ db.close();
162
+ }
163
+ }
164
+ case 'beecork_cron_create': {
165
+ const { name: jobName, scheduleType, schedule, message, tabName } = args;
166
+ const crontab = loadCrontab();
167
+ const job = {
168
+ id: uuidv4(),
169
+ name: jobName,
170
+ scheduleType,
171
+ schedule,
172
+ tabName: tabName || 'default',
173
+ message,
174
+ enabled: true,
175
+ createdAt: new Date().toISOString(),
176
+ lastRunAt: null,
177
+ nextRunAt: null,
178
+ };
179
+ crontab.jobs.push(job);
180
+ saveCrontab(crontab);
181
+ return { content: [{ type: 'text', text: `Cron job created: "${jobName}" (${scheduleType}: ${schedule}) → tab:${job.tabName}\nID: ${job.id}` }] };
182
+ }
183
+ case 'beecork_cron_list': {
184
+ const crontab = loadCrontab();
185
+ if (crontab.jobs.length === 0) {
186
+ return { content: [{ type: 'text', text: 'No cron jobs scheduled.' }] };
187
+ }
188
+ const lines = crontab.jobs.map((j) => `- ${j.name} [${j.enabled ? 'enabled' : 'disabled'}] (${j.scheduleType}: ${j.schedule}) → tab:${j.tabName} (ID: ${j.id})`);
189
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
190
+ }
191
+ case 'beecork_cron_delete': {
192
+ const { id } = args;
193
+ const crontab = loadCrontab();
194
+ const before = crontab.jobs.length;
195
+ crontab.jobs = crontab.jobs.filter((j) => j.id !== id);
196
+ if (crontab.jobs.length === before) {
197
+ return { content: [{ type: 'text', text: `No cron job found with ID: ${id}` }] };
198
+ }
199
+ saveCrontab(crontab);
200
+ return { content: [{ type: 'text', text: `Deleted cron job: ${id}` }] };
201
+ }
202
+ case 'beecork_tab_create': {
203
+ const { name: tabName, workingDir } = args;
204
+ const db = getDb();
205
+ try {
206
+ const existing = db.prepare('SELECT name FROM tabs WHERE name = ?').get(tabName);
207
+ if (existing) {
208
+ return { content: [{ type: 'text', text: `Tab "${tabName}" already exists.` }] };
209
+ }
210
+ const id = uuidv4();
211
+ const dir = workingDir || os.homedir();
212
+ db.prepare('INSERT INTO tabs (id, name, session_id, status, working_dir) VALUES (?, ?, ?, ?, ?)').run(id, tabName, uuidv4(), 'idle', dir);
213
+ return { content: [{ type: 'text', text: `Created tab: "${tabName}" (working dir: ${dir})` }] };
214
+ }
215
+ finally {
216
+ db.close();
217
+ }
218
+ }
219
+ case 'beecork_tab_list': {
220
+ const db = getDb();
221
+ try {
222
+ const tabs = db.prepare('SELECT name, status, working_dir, last_activity_at FROM tabs ORDER BY last_activity_at DESC').all();
223
+ if (tabs.length === 0) {
224
+ return { content: [{ type: 'text', text: 'No tabs.' }] };
225
+ }
226
+ const lines = tabs.map(t => `- ${t.name} [${t.status}] dir:${t.working_dir} last:${t.last_activity_at}`);
227
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
228
+ }
229
+ finally {
230
+ db.close();
231
+ }
232
+ }
233
+ case 'beecork_send_message': {
234
+ const { tabName, message } = args;
235
+ const db = getDb();
236
+ try {
237
+ db.prepare('INSERT INTO pending_messages (tab_name, message) VALUES (?, ?)').run(tabName, message);
238
+ return { content: [{ type: 'text', text: `Message queued for tab "${tabName}".` }] };
239
+ }
240
+ finally {
241
+ db.close();
242
+ }
243
+ }
244
+ case 'beecork_recall': {
245
+ const { query, limit } = args;
246
+ const db = getDb();
247
+ try {
248
+ const maxResults = Math.min(limit ?? 10, 50);
249
+ const memories = db.prepare('SELECT content, tab_name, source, created_at FROM memories WHERE content LIKE ? ORDER BY created_at DESC LIMIT ?').all(`%${query}%`, maxResults);
250
+ if (memories.length === 0) {
251
+ return { content: [{ type: 'text', text: `No memories found matching "${query}".` }] };
252
+ }
253
+ const lines = memories.map(m => {
254
+ const scope = m.tab_name ? `tab:${m.tab_name}` : 'global';
255
+ return `- [${m.source}, ${scope}, ${m.created_at}] ${m.content}`;
256
+ });
257
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
258
+ }
259
+ finally {
260
+ db.close();
261
+ }
262
+ }
263
+ case 'beecork_notify': {
264
+ const { message } = args;
265
+ const db = getDb();
266
+ try {
267
+ db.prepare("INSERT INTO pending_messages (tab_name, message, type) VALUES ('_notify', ?, 'notification')").run(message);
268
+ return { content: [{ type: 'text', text: `Notification sent to user.` }] };
269
+ }
270
+ finally {
271
+ db.close();
272
+ }
273
+ }
274
+ case 'beecork_status': {
275
+ const db = getDb();
276
+ try {
277
+ const tabCount = db.prepare('SELECT COUNT(*) as c FROM tabs').get().c;
278
+ const activeTabs = db.prepare("SELECT COUNT(*) as c FROM tabs WHERE status = 'running'").get().c;
279
+ const cronCount = db.prepare('SELECT COUNT(*) as c FROM cron_jobs WHERE enabled = 1').get().c;
280
+ const memoryCount = db.prepare('SELECT COUNT(*) as c FROM memories').get().c;
281
+ const lines = [
282
+ `Tabs: ${tabCount} total, ${activeTabs} running`,
283
+ `Cron jobs: ${cronCount} active`,
284
+ `Memories: ${memoryCount} stored`,
285
+ ];
286
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
287
+ }
288
+ finally {
289
+ db.close();
290
+ }
291
+ }
292
+ default:
293
+ return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
294
+ }
295
+ });
296
+ async function main() {
297
+ const transport = new StdioServerTransport();
298
+ await server.connect(transport);
299
+ }
300
+ main().catch((err) => {
301
+ console.error('MCP server error:', err);
302
+ process.exit(1);
303
+ });
304
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { BeecorkConfig } from '../types.js';
2
+ /** Auto-extract memories from a completed session */
3
+ export declare function extractMemories(config: BeecorkConfig, tabName: string, sessionText: string, durationMs: number): Promise<void>;
4
+ /** Inject relevant memories into a prompt */
5
+ export declare function getRelevantMemories(tabName: string): string[];
6
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/memory/extractor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD,qDAAqD;AACrD,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW7D"}
@@ -0,0 +1,105 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { getDb } from '../db/index.js';
3
+ import { logger } from '../util/logger.js';
4
+ const EXTRACTION_PROMPT = `Extract 0-5 key facts, decisions, or outcomes from this session transcript that would be useful in future sessions. Output ONLY a JSON array of strings. If nothing is worth remembering, output an empty array [].
5
+
6
+ Examples of what to extract:
7
+ - Server addresses, credentials, file paths
8
+ - User preferences ("prefers deployments after 11pm")
9
+ - Decisions made ("chose PostgreSQL over MySQL for X reason")
10
+ - Outcomes ("deploy succeeded", "bug was in auth middleware")
11
+
12
+ Session transcript:
13
+ `;
14
+ /** Auto-extract memories from a completed session */
15
+ export async function extractMemories(config, tabName, sessionText, durationMs) {
16
+ // Only extract from non-trivial sessions
17
+ if (durationMs < 10000 || sessionText.length < 200)
18
+ return;
19
+ // Rate limit: check if we extracted recently for this tab
20
+ const db = getDb();
21
+ const recent = db.prepare(`SELECT COUNT(*) as count FROM memories
22
+ WHERE tab_name = ? AND source = 'auto'
23
+ AND created_at > datetime('now', '-5 minutes')`).get(tabName);
24
+ if (recent.count > 0) {
25
+ logger.debug(`[${tabName}] Skipping memory extraction — too recent`);
26
+ return;
27
+ }
28
+ try {
29
+ const prompt = EXTRACTION_PROMPT + sessionText.slice(0, 5000); // Limit transcript size
30
+ const facts = await runExtractionSession(config, prompt);
31
+ if (facts.length === 0)
32
+ return;
33
+ for (const fact of facts) {
34
+ db.prepare('INSERT INTO memories (content, tab_name, source) VALUES (?, ?, ?)').run(fact, tabName, 'auto');
35
+ }
36
+ logger.info(`[${tabName}] Auto-extracted ${facts.length} memories`);
37
+ }
38
+ catch (err) {
39
+ logger.error(`[${tabName}] Memory extraction failed:`, err);
40
+ }
41
+ }
42
+ /** Inject relevant memories into a prompt */
43
+ export function getRelevantMemories(tabName) {
44
+ const db = getDb();
45
+ // Get recent global memories + tab-specific memories
46
+ const memories = db.prepare(`SELECT content FROM memories
47
+ WHERE tab_name IS NULL OR tab_name = ?
48
+ ORDER BY created_at DESC LIMIT 20`).all(tabName);
49
+ return memories.map(m => m.content);
50
+ }
51
+ async function runExtractionSession(config, prompt) {
52
+ return new Promise((resolve, reject) => {
53
+ const args = [
54
+ '-p',
55
+ '--output-format', 'stream-json',
56
+ '--verbose',
57
+ '--dangerously-skip-permissions',
58
+ '--no-session-persistence',
59
+ prompt,
60
+ ];
61
+ const proc = spawn(config.claudeCode.bin, args, {
62
+ cwd: process.cwd(),
63
+ stdio: ['ignore', 'pipe', 'pipe'],
64
+ });
65
+ let output = '';
66
+ proc.stdout.on('data', (chunk) => {
67
+ const lines = chunk.toString().split('\n');
68
+ for (const line of lines) {
69
+ if (!line.trim())
70
+ continue;
71
+ try {
72
+ const event = JSON.parse(line);
73
+ if (event.type === 'result' && event.result) {
74
+ output = event.result;
75
+ }
76
+ }
77
+ catch { /* skip non-JSON */ }
78
+ }
79
+ });
80
+ proc.on('exit', () => {
81
+ try {
82
+ // Try to parse the JSON array from the output
83
+ const jsonMatch = output.match(/\[[\s\S]*?\]/);
84
+ if (jsonMatch) {
85
+ const facts = JSON.parse(jsonMatch[0]);
86
+ if (Array.isArray(facts) && facts.every(f => typeof f === 'string')) {
87
+ resolve(facts.slice(0, 5)); // Max 5 facts
88
+ return;
89
+ }
90
+ }
91
+ resolve([]);
92
+ }
93
+ catch {
94
+ resolve([]);
95
+ }
96
+ });
97
+ proc.on('error', reject);
98
+ // Timeout after 30s
99
+ setTimeout(() => {
100
+ proc.kill('SIGTERM');
101
+ resolve([]);
102
+ }, 30000);
103
+ });
104
+ }
105
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/memory/extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function installService(): string;
2
+ export declare function uninstallService(): string;
3
+ export declare function startService(): void;
4
+ export declare function stopService(): void;
5
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/service/install.ts"],"names":[],"mappings":"AAkCA,wBAAgB,cAAc,IAAI,MAAM,CAWvC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAOzC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAQnC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAYlC"}
@@ -0,0 +1,118 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import { getPlatform } from '../util/platform.js';
5
+ import { ensureBeecorkDirs } from '../util/paths.js';
6
+ import { getLaunchdPlist, getSystemdUnit, getLaunchdPlistPath, getSystemdUnitPath, } from './templates.js';
7
+ function findNodePath() {
8
+ try {
9
+ return execSync('which node', { encoding: 'utf-8' }).trim();
10
+ }
11
+ catch {
12
+ return '/usr/local/bin/node';
13
+ }
14
+ }
15
+ function findDaemonPath() {
16
+ // import.meta.url is dist/service/install.js — daemon is at dist/daemon.js (one level up)
17
+ const thisFile = new URL(import.meta.url).pathname;
18
+ const distDir = path.dirname(path.dirname(thisFile)); // go up from service/ to dist/
19
+ const daemonPath = path.join(distDir, 'daemon.js');
20
+ if (fs.existsSync(daemonPath))
21
+ return daemonPath;
22
+ // Fallback: maybe we're in src/ during development
23
+ const srcDaemon = path.resolve(distDir, '..', 'dist', 'daemon.js');
24
+ if (fs.existsSync(srcDaemon))
25
+ return srcDaemon;
26
+ throw new Error('Could not find daemon.js. Make sure beecork is built (npm run build).');
27
+ }
28
+ export function installService() {
29
+ ensureBeecorkDirs();
30
+ const platform = getPlatform();
31
+ const nodePath = findNodePath();
32
+ const daemonPath = findDaemonPath();
33
+ if (platform === 'mac') {
34
+ return installLaunchd(nodePath, daemonPath);
35
+ }
36
+ else {
37
+ return installSystemd(nodePath, daemonPath);
38
+ }
39
+ }
40
+ export function uninstallService() {
41
+ const platform = getPlatform();
42
+ if (platform === 'mac') {
43
+ return uninstallLaunchd();
44
+ }
45
+ else {
46
+ return uninstallSystemd();
47
+ }
48
+ }
49
+ export function startService() {
50
+ const platform = getPlatform();
51
+ if (platform === 'mac') {
52
+ const plistPath = getLaunchdPlistPath();
53
+ execSync(`launchctl load "${plistPath}"`, { stdio: 'inherit' });
54
+ }
55
+ else {
56
+ execSync('systemctl --user start beecork', { stdio: 'inherit' });
57
+ }
58
+ }
59
+ export function stopService() {
60
+ const platform = getPlatform();
61
+ if (platform === 'mac') {
62
+ const plistPath = getLaunchdPlistPath();
63
+ try {
64
+ execSync(`launchctl unload "${plistPath}"`, { stdio: 'inherit' });
65
+ }
66
+ catch { /* not loaded */ }
67
+ }
68
+ else {
69
+ try {
70
+ execSync('systemctl --user stop beecork', { stdio: 'inherit' });
71
+ }
72
+ catch { /* not running */ }
73
+ }
74
+ }
75
+ function installLaunchd(nodePath, daemonPath) {
76
+ const plistPath = getLaunchdPlistPath();
77
+ const plistDir = path.dirname(plistPath);
78
+ fs.mkdirSync(plistDir, { recursive: true });
79
+ const content = getLaunchdPlist(nodePath, daemonPath);
80
+ fs.writeFileSync(plistPath, content);
81
+ return plistPath;
82
+ }
83
+ function uninstallLaunchd() {
84
+ const plistPath = getLaunchdPlistPath();
85
+ try {
86
+ execSync(`launchctl unload "${plistPath}"`, { stdio: 'pipe' });
87
+ }
88
+ catch { /* ok */ }
89
+ if (fs.existsSync(plistPath))
90
+ fs.unlinkSync(plistPath);
91
+ return plistPath;
92
+ }
93
+ function installSystemd(nodePath, daemonPath) {
94
+ const unitPath = getSystemdUnitPath();
95
+ const unitDir = path.dirname(unitPath);
96
+ fs.mkdirSync(unitDir, { recursive: true });
97
+ const content = getSystemdUnit(nodePath, daemonPath);
98
+ fs.writeFileSync(unitPath, content);
99
+ execSync('systemctl --user daemon-reload', { stdio: 'pipe' });
100
+ execSync('systemctl --user enable beecork', { stdio: 'pipe' });
101
+ return unitPath;
102
+ }
103
+ function uninstallSystemd() {
104
+ const unitPath = getSystemdUnitPath();
105
+ try {
106
+ execSync('systemctl --user disable beecork', { stdio: 'pipe' });
107
+ }
108
+ catch { /* ok */ }
109
+ try {
110
+ execSync('systemctl --user stop beecork', { stdio: 'pipe' });
111
+ }
112
+ catch { /* ok */ }
113
+ if (fs.existsSync(unitPath))
114
+ fs.unlinkSync(unitPath);
115
+ execSync('systemctl --user daemon-reload', { stdio: 'pipe' });
116
+ return unitPath;
117
+ }
118
+ //# sourceMappingURL=install.js.map