beecork 1.1.0 → 1.3.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 (195) hide show
  1. package/dist/capabilities/index.d.ts +4 -0
  2. package/dist/capabilities/index.d.ts.map +1 -0
  3. package/dist/capabilities/index.js +3 -0
  4. package/dist/capabilities/index.js.map +1 -0
  5. package/dist/capabilities/manager.d.ts +14 -0
  6. package/dist/capabilities/manager.d.ts.map +1 -0
  7. package/dist/capabilities/manager.js +112 -0
  8. package/dist/capabilities/manager.js.map +1 -0
  9. package/dist/capabilities/packs.d.ts +3 -0
  10. package/dist/capabilities/packs.d.ts.map +1 -0
  11. package/dist/capabilities/packs.js +112 -0
  12. package/dist/capabilities/packs.js.map +1 -0
  13. package/dist/capabilities/types.d.ts +22 -0
  14. package/dist/capabilities/types.d.ts.map +1 -0
  15. package/dist/capabilities/types.js +2 -0
  16. package/dist/capabilities/types.js.map +1 -0
  17. package/dist/channels/command-handler.d.ts +28 -0
  18. package/dist/channels/command-handler.d.ts.map +1 -0
  19. package/dist/channels/command-handler.js +242 -0
  20. package/dist/channels/command-handler.js.map +1 -0
  21. package/dist/channels/discord.d.ts +2 -2
  22. package/dist/channels/discord.d.ts.map +1 -1
  23. package/dist/channels/discord.js +37 -123
  24. package/dist/channels/discord.js.map +1 -1
  25. package/dist/channels/loader.d.ts.map +1 -1
  26. package/dist/channels/loader.js +2 -1
  27. package/dist/channels/loader.js.map +1 -1
  28. package/dist/channels/registry.d.ts +1 -4
  29. package/dist/channels/registry.d.ts.map +1 -1
  30. package/dist/channels/registry.js +0 -13
  31. package/dist/channels/registry.js.map +1 -1
  32. package/dist/channels/telegram.d.ts +2 -2
  33. package/dist/channels/telegram.d.ts.map +1 -1
  34. package/dist/channels/telegram.js +59 -225
  35. package/dist/channels/telegram.js.map +1 -1
  36. package/dist/channels/types.d.ts +2 -0
  37. package/dist/channels/types.d.ts.map +1 -1
  38. package/dist/channels/webhook.d.ts +4 -12
  39. package/dist/channels/webhook.d.ts.map +1 -1
  40. package/dist/channels/webhook.js +30 -30
  41. package/dist/channels/webhook.js.map +1 -1
  42. package/dist/channels/whatsapp.d.ts +2 -2
  43. package/dist/channels/whatsapp.d.ts.map +1 -1
  44. package/dist/channels/whatsapp.js +33 -103
  45. package/dist/channels/whatsapp.js.map +1 -1
  46. package/dist/cli/capabilities.d.ts +4 -0
  47. package/dist/cli/capabilities.d.ts.map +1 -0
  48. package/dist/cli/capabilities.js +73 -0
  49. package/dist/cli/capabilities.js.map +1 -0
  50. package/dist/cli/commands.d.ts +2 -0
  51. package/dist/cli/commands.d.ts.map +1 -1
  52. package/dist/cli/commands.js +40 -12
  53. package/dist/cli/commands.js.map +1 -1
  54. package/dist/cli/media.d.ts +1 -1
  55. package/dist/cli/media.d.ts.map +1 -1
  56. package/dist/cli/media.js +3 -3
  57. package/dist/cli/media.js.map +1 -1
  58. package/dist/cli/setup.d.ts +1 -1
  59. package/dist/cli/setup.d.ts.map +1 -1
  60. package/dist/cli/setup.js +216 -144
  61. package/dist/cli/setup.js.map +1 -1
  62. package/dist/cli/store.d.ts +4 -0
  63. package/dist/cli/store.d.ts.map +1 -0
  64. package/dist/cli/store.js +92 -0
  65. package/dist/cli/store.js.map +1 -0
  66. package/dist/config.js +8 -0
  67. package/dist/config.js.map +1 -1
  68. package/dist/daemon.js +26 -14
  69. package/dist/daemon.js.map +1 -1
  70. package/dist/dashboard/html.d.ts.map +1 -1
  71. package/dist/dashboard/html.js +131 -11
  72. package/dist/dashboard/html.js.map +1 -1
  73. package/dist/dashboard/server.d.ts.map +1 -1
  74. package/dist/dashboard/server.js +253 -22
  75. package/dist/dashboard/server.js.map +1 -1
  76. package/dist/db/index.d.ts.map +1 -1
  77. package/dist/db/index.js +6 -3
  78. package/dist/db/index.js.map +1 -1
  79. package/dist/db/migrations.d.ts.map +1 -1
  80. package/dist/db/migrations.js +72 -11
  81. package/dist/db/migrations.js.map +1 -1
  82. package/dist/index.js +162 -7
  83. package/dist/index.js.map +1 -1
  84. package/dist/knowledge/index.d.ts +3 -0
  85. package/dist/knowledge/index.d.ts.map +1 -0
  86. package/dist/knowledge/index.js +2 -0
  87. package/dist/knowledge/index.js.map +1 -0
  88. package/dist/knowledge/manager.d.ts +18 -0
  89. package/dist/knowledge/manager.d.ts.map +1 -0
  90. package/dist/knowledge/manager.js +137 -0
  91. package/dist/knowledge/manager.js.map +1 -0
  92. package/dist/knowledge/types.d.ts +8 -0
  93. package/dist/knowledge/types.d.ts.map +1 -0
  94. package/dist/knowledge/types.js +2 -0
  95. package/dist/knowledge/types.js.map +1 -0
  96. package/dist/machines/forwarder.d.ts.map +1 -1
  97. package/dist/machines/forwarder.js +15 -5
  98. package/dist/machines/forwarder.js.map +1 -1
  99. package/dist/mcp/server.js +277 -40
  100. package/dist/mcp/server.js.map +1 -1
  101. package/dist/media/store.d.ts.map +1 -1
  102. package/dist/media/store.js +5 -2
  103. package/dist/media/store.js.map +1 -1
  104. package/dist/memory/extractor.js +38 -11
  105. package/dist/memory/extractor.js.map +1 -1
  106. package/dist/observability/analytics.d.ts +0 -1
  107. package/dist/observability/analytics.d.ts.map +1 -1
  108. package/dist/observability/analytics.js +1 -16
  109. package/dist/observability/analytics.js.map +1 -1
  110. package/dist/pipe/anthropic-client.js +1 -1
  111. package/dist/pipe/anthropic-client.js.map +1 -1
  112. package/dist/pipe/memory-store.d.ts.map +1 -1
  113. package/dist/pipe/memory-store.js +9 -13
  114. package/dist/pipe/memory-store.js.map +1 -1
  115. package/dist/pipe/project-scanner.js +3 -4
  116. package/dist/pipe/project-scanner.js.map +1 -1
  117. package/dist/pipe/types.d.ts +6 -5
  118. package/dist/pipe/types.d.ts.map +1 -1
  119. package/dist/projects/manager.d.ts.map +1 -1
  120. package/dist/projects/manager.js +9 -1
  121. package/dist/projects/manager.js.map +1 -1
  122. package/dist/projects/router.d.ts.map +1 -1
  123. package/dist/projects/router.js +22 -5
  124. package/dist/projects/router.js.map +1 -1
  125. package/dist/session/context-monitor.d.ts.map +1 -1
  126. package/dist/session/context-monitor.js +3 -2
  127. package/dist/session/context-monitor.js.map +1 -1
  128. package/dist/session/manager.d.ts +1 -0
  129. package/dist/session/manager.d.ts.map +1 -1
  130. package/dist/session/manager.js +23 -9
  131. package/dist/session/manager.js.map +1 -1
  132. package/dist/session/subprocess.d.ts +1 -0
  133. package/dist/session/subprocess.d.ts.map +1 -1
  134. package/dist/session/subprocess.js +9 -1
  135. package/dist/session/subprocess.js.map +1 -1
  136. package/dist/session/tool-classifier.d.ts +1 -0
  137. package/dist/session/tool-classifier.d.ts.map +1 -1
  138. package/dist/session/tool-classifier.js.map +1 -1
  139. package/dist/{cron → tasks}/scheduler.d.ts +7 -3
  140. package/dist/tasks/scheduler.d.ts.map +1 -0
  141. package/dist/{cron → tasks}/scheduler.js +29 -24
  142. package/dist/tasks/scheduler.js.map +1 -0
  143. package/dist/tasks/store.d.ts +14 -0
  144. package/dist/tasks/store.d.ts.map +1 -0
  145. package/dist/{cron → tasks}/store.js +15 -13
  146. package/dist/tasks/store.js.map +1 -0
  147. package/dist/timeline/index.d.ts +4 -0
  148. package/dist/timeline/index.d.ts.map +1 -0
  149. package/dist/timeline/index.js +3 -0
  150. package/dist/timeline/index.js.map +1 -0
  151. package/dist/timeline/logger.d.ts +9 -0
  152. package/dist/timeline/logger.d.ts.map +1 -0
  153. package/dist/timeline/logger.js +10 -0
  154. package/dist/timeline/logger.js.map +1 -0
  155. package/dist/timeline/query.d.ts +12 -0
  156. package/dist/timeline/query.d.ts.map +1 -0
  157. package/dist/timeline/query.js +57 -0
  158. package/dist/timeline/query.js.map +1 -0
  159. package/dist/timeline/types.d.ts +13 -0
  160. package/dist/timeline/types.d.ts.map +1 -0
  161. package/dist/timeline/types.js +2 -0
  162. package/dist/timeline/types.js.map +1 -0
  163. package/dist/types.d.ts +12 -5
  164. package/dist/types.d.ts.map +1 -1
  165. package/dist/types.js.map +1 -1
  166. package/dist/voice/stt.d.ts +2 -0
  167. package/dist/voice/stt.d.ts.map +1 -1
  168. package/dist/voice/stt.js +10 -0
  169. package/dist/voice/stt.js.map +1 -1
  170. package/dist/watchers/evaluator.d.ts +6 -0
  171. package/dist/watchers/evaluator.d.ts.map +1 -0
  172. package/dist/watchers/evaluator.js +30 -0
  173. package/dist/watchers/evaluator.js.map +1 -0
  174. package/dist/watchers/index.d.ts +5 -0
  175. package/dist/watchers/index.d.ts.map +1 -0
  176. package/dist/watchers/index.js +4 -0
  177. package/dist/watchers/index.js.map +1 -0
  178. package/dist/watchers/scheduler.d.ts +14 -0
  179. package/dist/watchers/scheduler.d.ts.map +1 -0
  180. package/dist/watchers/scheduler.js +134 -0
  181. package/dist/watchers/scheduler.js.map +1 -0
  182. package/dist/watchers/store.d.ts +11 -0
  183. package/dist/watchers/store.d.ts.map +1 -0
  184. package/dist/watchers/store.js +57 -0
  185. package/dist/watchers/store.js.map +1 -0
  186. package/dist/watchers/types.d.ts +16 -0
  187. package/dist/watchers/types.d.ts.map +1 -0
  188. package/dist/watchers/types.js +2 -0
  189. package/dist/watchers/types.js.map +1 -0
  190. package/package.json +2 -2
  191. package/dist/cron/scheduler.d.ts.map +0 -1
  192. package/dist/cron/scheduler.js.map +0 -1
  193. package/dist/cron/store.d.ts +0 -12
  194. package/dist/cron/store.d.ts.map +0 -1
  195. package/dist/cron/store.js.map +0 -1
@@ -0,0 +1,4 @@
1
+ export type { CapabilityPack, EnabledCapability } from './types.js';
2
+ export { CAPABILITY_PACKS } from './packs.js';
3
+ export { getAvailablePacks, getEnabledCapabilities, isEnabled, enablePack, disablePack, updateMcpConfig } from './manager.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { CAPABILITY_PACKS } from './packs.js';
2
+ export { getAvailablePacks, getEnabledCapabilities, isEnabled, enablePack, disablePack, updateMcpConfig } from './manager.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { CapabilityPack, EnabledCapability } from './types.js';
2
+ /** Get all available packs */
3
+ export declare function getAvailablePacks(): CapabilityPack[];
4
+ /** Get enabled capabilities from config */
5
+ export declare function getEnabledCapabilities(): EnabledCapability[];
6
+ /** Check if a pack is enabled */
7
+ export declare function isEnabled(packId: string): boolean;
8
+ /** Enable a capability pack */
9
+ export declare function enablePack(packId: string, apiKey?: string): void;
10
+ /** Disable a capability pack */
11
+ export declare function disablePack(packId: string): void;
12
+ /** Regenerate MCP config based on enabled capabilities */
13
+ export declare function updateMcpConfig(): void;
14
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/capabilities/manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpE,8BAA8B;AAC9B,wBAAgB,iBAAiB,IAAI,cAAc,EAAE,CAEpD;AAED,2CAA2C;AAC3C,wBAAgB,sBAAsB,IAAI,iBAAiB,EAAE,CAG5D;AAED,iCAAiC;AACjC,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,+BAA+B;AAC/B,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAiChE;AAED,gCAAgC;AAChC,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAOhD;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,IAAI,IAAI,CAoDtC"}
@@ -0,0 +1,112 @@
1
+ import fs from 'node:fs';
2
+ import { execSync } from 'node:child_process';
3
+ import { getConfig, saveConfig } from '../config.js';
4
+ import { getMcpConfigPath } from '../util/paths.js';
5
+ import { logger } from '../util/logger.js';
6
+ import { CAPABILITY_PACKS } from './packs.js';
7
+ /** Get all available packs */
8
+ export function getAvailablePacks() {
9
+ return CAPABILITY_PACKS;
10
+ }
11
+ /** Get enabled capabilities from config */
12
+ export function getEnabledCapabilities() {
13
+ const config = getConfig();
14
+ return config.capabilities || [];
15
+ }
16
+ /** Check if a pack is enabled */
17
+ export function isEnabled(packId) {
18
+ return getEnabledCapabilities().some(c => c.packId === packId);
19
+ }
20
+ /** Enable a capability pack */
21
+ export function enablePack(packId, apiKey) {
22
+ const pack = CAPABILITY_PACKS.find(p => p.id === packId);
23
+ if (!pack)
24
+ throw new Error(`Unknown capability: ${packId}. Use 'beecork capabilities' to list.`);
25
+ if (pack.requiresApiKey && !apiKey) {
26
+ throw new Error(`${pack.name} requires an API key. Hint: ${pack.apiKeyHint}`);
27
+ }
28
+ // Install the MCP server package
29
+ try {
30
+ console.log(`Installing ${pack.mcpServer.package}...`);
31
+ execSync(`npm install -g ${pack.mcpServer.package}`, { stdio: 'pipe' });
32
+ }
33
+ catch (err) {
34
+ logger.warn(`Package install skipped (may already be available via npx): ${pack.mcpServer.package}`);
35
+ }
36
+ // Update config
37
+ const config = getConfig();
38
+ const capabilities = config.capabilities || [];
39
+ const existing = capabilities.findIndex(c => c.packId === packId);
40
+ const entry = { packId, apiKey, enabledAt: new Date().toISOString() };
41
+ if (existing >= 0) {
42
+ capabilities[existing] = entry;
43
+ }
44
+ else {
45
+ capabilities.push(entry);
46
+ }
47
+ config.capabilities = capabilities;
48
+ saveConfig(config);
49
+ // Update MCP config
50
+ updateMcpConfig();
51
+ logger.info(`Capability enabled: ${pack.name}`);
52
+ }
53
+ /** Disable a capability pack */
54
+ export function disablePack(packId) {
55
+ const config = getConfig();
56
+ const capabilities = config.capabilities || [];
57
+ config.capabilities = capabilities.filter(c => c.packId !== packId);
58
+ saveConfig(config);
59
+ updateMcpConfig();
60
+ logger.info(`Capability disabled: ${packId}`);
61
+ }
62
+ /** Regenerate MCP config based on enabled capabilities */
63
+ export function updateMcpConfig() {
64
+ const mcpConfigPath = getMcpConfigPath();
65
+ let mcpConfig = { mcpServers: {} };
66
+ // Load existing MCP config (preserves beecork's own MCP server)
67
+ if (fs.existsSync(mcpConfigPath)) {
68
+ try {
69
+ mcpConfig = JSON.parse(fs.readFileSync(mcpConfigPath, 'utf-8'));
70
+ }
71
+ catch { }
72
+ }
73
+ // Remove old capability servers (they start with 'cap-')
74
+ for (const key of Object.keys(mcpConfig.mcpServers)) {
75
+ if (key.startsWith('cap-'))
76
+ delete mcpConfig.mcpServers[key];
77
+ }
78
+ // Add enabled capability servers
79
+ const capabilities = getEnabledCapabilities();
80
+ for (const cap of capabilities) {
81
+ const pack = CAPABILITY_PACKS.find(p => p.id === cap.packId);
82
+ if (!pack)
83
+ continue;
84
+ // Resolve env vars
85
+ const env = {};
86
+ if (pack.mcpServer.env) {
87
+ for (const [key, template] of Object.entries(pack.mcpServer.env)) {
88
+ env[key] = template.replace(/\$\{(\w+)\}/g, (_, varName) => {
89
+ if (varName === pack.apiKeyEnvVar)
90
+ return cap.apiKey || '';
91
+ return process.env[varName] || '';
92
+ });
93
+ }
94
+ }
95
+ if (cap.apiKey && pack.apiKeyEnvVar) {
96
+ env[pack.apiKeyEnvVar] = cap.apiKey;
97
+ }
98
+ // Resolve args templates
99
+ const args = (pack.mcpServer.args || []).map(arg => arg.replace(/\$\{(\w+)\}/g, (_, varName) => {
100
+ if (varName === pack.apiKeyEnvVar)
101
+ return cap.apiKey || '';
102
+ return process.env[varName] || '';
103
+ }));
104
+ mcpConfig.mcpServers[`cap-${cap.packId}`] = {
105
+ command: pack.mcpServer.command,
106
+ args,
107
+ ...(Object.keys(env).length > 0 ? { env } : {}),
108
+ };
109
+ }
110
+ fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2) + '\n', { mode: 0o600 });
111
+ }
112
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/capabilities/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CapabilityPack } from './types.js';
2
+ export declare const CAPABILITY_PACKS: CapabilityPack[];
3
+ //# sourceMappingURL=packs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packs.d.ts","sourceRoot":"","sources":["../../src/capabilities/packs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAiH5C,CAAC"}
@@ -0,0 +1,112 @@
1
+ export const CAPABILITY_PACKS = [
2
+ // Productivity
3
+ {
4
+ id: 'email',
5
+ name: 'Email (Gmail)',
6
+ description: 'Read, send, and manage emails via Gmail',
7
+ category: 'productivity',
8
+ mcpServer: {
9
+ package: '@anthropic/gmail-mcp',
10
+ command: 'npx',
11
+ args: ['-y', '@anthropic/gmail-mcp'],
12
+ },
13
+ requiresApiKey: true,
14
+ apiKeyHint: 'Google OAuth credentials (follow the setup guide)',
15
+ apiKeyEnvVar: 'GOOGLE_OAUTH_CREDENTIALS',
16
+ setupUrl: 'https://support.beecork.com/capabilities/email',
17
+ },
18
+ {
19
+ id: 'calendar',
20
+ name: 'Calendar (Google)',
21
+ description: 'Schedule meetings, check availability, manage events',
22
+ category: 'productivity',
23
+ mcpServer: {
24
+ package: '@anthropic/google-calendar-mcp',
25
+ command: 'npx',
26
+ args: ['-y', '@anthropic/google-calendar-mcp'],
27
+ },
28
+ requiresApiKey: true,
29
+ apiKeyHint: 'Google OAuth credentials (same as email if already set up)',
30
+ apiKeyEnvVar: 'GOOGLE_OAUTH_CREDENTIALS',
31
+ setupUrl: 'https://support.beecork.com/capabilities/calendar',
32
+ },
33
+ {
34
+ id: 'notion',
35
+ name: 'Notion',
36
+ description: 'Read and write pages, databases, notes in Notion',
37
+ category: 'productivity',
38
+ mcpServer: {
39
+ package: '@notionhq/notion-mcp-server',
40
+ command: 'npx',
41
+ args: ['-y', '@notionhq/notion-mcp-server'],
42
+ env: { OPENAPI_MCP_HEADERS: '{"Authorization":"Bearer ${NOTION_API_KEY}","Notion-Version":"2022-06-28"}' },
43
+ },
44
+ requiresApiKey: true,
45
+ apiKeyHint: 'Notion integration token (from notion.so/my-integrations)',
46
+ apiKeyEnvVar: 'NOTION_API_KEY',
47
+ setupUrl: 'https://support.beecork.com/capabilities/notion',
48
+ },
49
+ {
50
+ id: 'drive',
51
+ name: 'Google Drive',
52
+ description: 'Search, read, and organize files in Google Drive',
53
+ category: 'productivity',
54
+ mcpServer: {
55
+ package: '@anthropic/gdrive-mcp',
56
+ command: 'npx',
57
+ args: ['-y', '@anthropic/gdrive-mcp'],
58
+ },
59
+ requiresApiKey: true,
60
+ apiKeyHint: 'Google OAuth credentials',
61
+ apiKeyEnvVar: 'GOOGLE_OAUTH_CREDENTIALS',
62
+ setupUrl: 'https://support.beecork.com/capabilities/drive',
63
+ },
64
+ // Development
65
+ {
66
+ id: 'github',
67
+ name: 'GitHub',
68
+ description: 'Manage repos, PRs, issues, CI/CD workflows',
69
+ category: 'development',
70
+ mcpServer: {
71
+ package: '@modelcontextprotocol/server-github',
72
+ command: 'npx',
73
+ args: ['-y', '@modelcontextprotocol/server-github'],
74
+ env: { GITHUB_PERSONAL_ACCESS_TOKEN: '${GITHUB_TOKEN}' },
75
+ },
76
+ requiresApiKey: true,
77
+ apiKeyHint: 'GitHub personal access token (from github.com/settings/tokens)',
78
+ apiKeyEnvVar: 'GITHUB_TOKEN',
79
+ setupUrl: 'https://support.beecork.com/capabilities/github',
80
+ },
81
+ // Data
82
+ {
83
+ id: 'database',
84
+ name: 'Database (PostgreSQL)',
85
+ description: 'Query databases, inspect schemas, analyze data',
86
+ category: 'data',
87
+ mcpServer: {
88
+ package: '@modelcontextprotocol/server-postgres',
89
+ command: 'npx',
90
+ args: ['-y', '@modelcontextprotocol/server-postgres', '${DATABASE_URL}'],
91
+ },
92
+ requiresApiKey: true,
93
+ apiKeyHint: 'PostgreSQL connection string (e.g., postgresql://user:pass@host:5432/db)',
94
+ apiKeyEnvVar: 'DATABASE_URL',
95
+ setupUrl: 'https://support.beecork.com/capabilities/database',
96
+ },
97
+ // Web
98
+ {
99
+ id: 'web',
100
+ name: 'Web Browsing',
101
+ description: 'Search the web, fetch and read web pages',
102
+ category: 'web',
103
+ mcpServer: {
104
+ package: '@anthropic/web-search-mcp',
105
+ command: 'npx',
106
+ args: ['-y', '@anthropic/web-search-mcp'],
107
+ },
108
+ requiresApiKey: false,
109
+ setupUrl: 'https://support.beecork.com/capabilities/web',
110
+ },
111
+ ];
112
+ //# sourceMappingURL=packs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packs.js","sourceRoot":"","sources":["../../src/capabilities/packs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface CapabilityPack {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ category: 'productivity' | 'development' | 'data' | 'web';
6
+ mcpServer: {
7
+ package: string;
8
+ command: string;
9
+ args?: string[];
10
+ env?: Record<string, string>;
11
+ };
12
+ requiresApiKey: boolean;
13
+ apiKeyHint?: string;
14
+ apiKeyEnvVar?: string;
15
+ setupUrl?: string;
16
+ }
17
+ export interface EnabledCapability {
18
+ packId: string;
19
+ apiKey?: string;
20
+ enabledAt: string;
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/capabilities/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,cAAc,GAAG,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC;IAC1D,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC9B,CAAC;IACF,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/capabilities/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { TabManager } from '../session/manager.js';
2
+ export interface CommandContext {
3
+ userId: string;
4
+ text: string;
5
+ isAdmin: boolean;
6
+ channelId: string;
7
+ }
8
+ export interface CommandResult {
9
+ handled: boolean;
10
+ response?: string;
11
+ }
12
+ export interface RouteResult {
13
+ effectiveTabName: string;
14
+ projectPath?: string;
15
+ confirmationMessage?: string;
16
+ }
17
+ /**
18
+ * Handle shared commands that work identically across all channels.
19
+ * Returns { handled: true, response } if a command was matched.
20
+ * The channel is responsible for sending the response via its own API.
21
+ */
22
+ export declare function handleSharedCommand(ctx: CommandContext, tabManager: TabManager): Promise<CommandResult>;
23
+ /**
24
+ * Shared project routing logic — resolves which tab/project to use for a message.
25
+ * Extracted from the identical blocks in Telegram, WhatsApp, and Discord channels.
26
+ */
27
+ export declare function resolveProjectRoute(rawPrompt: string, tabName: string, text: string, userId: string): Promise<RouteResult>;
28
+ //# sourceMappingURL=command-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../src/channels/command-handler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,aAAa,CAAC,CA4MxB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CA0BtB"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Shared command handler for all channels.
3
+ * Extracts command logic so it's defined once and called from Telegram, WhatsApp, Discord, etc.
4
+ */
5
+ import { timeAgo } from '../util/text.js';
6
+ import { validateTabName } from '../config.js';
7
+ /**
8
+ * Handle shared commands that work identically across all channels.
9
+ * Returns { handled: true, response } if a command was matched.
10
+ * The channel is responsible for sending the response via its own API.
11
+ */
12
+ export async function handleSharedCommand(ctx, tabManager) {
13
+ const { text, userId, isAdmin } = ctx;
14
+ // /tabs
15
+ if (text === '/tabs' || text.startsWith('/tabs@')) {
16
+ const tabs = tabManager.listTabs();
17
+ if (tabs.length === 0)
18
+ return { handled: true, response: 'No tabs.' };
19
+ const list = tabs.map(t => `• ${t.name} [${t.status}] — ${timeAgo(t.lastActivityAt)}`).join('\n');
20
+ return { handled: true, response: list };
21
+ }
22
+ // /stop <name>
23
+ if (text.startsWith('/stop ')) {
24
+ if (!isAdmin)
25
+ return { handled: true, response: 'Only admin can stop tabs.' };
26
+ const tabName = text.slice(6).trim();
27
+ tabManager.stopTab(tabName);
28
+ return { handled: true, response: `Stopped tab: ${tabName}` };
29
+ }
30
+ // /tab <name> --set-prompt "..."
31
+ if (text.startsWith('/tab ')) {
32
+ const rest = text.slice(5);
33
+ const setPromptMatch = rest.match(/^(\S+)\s+--set-prompt\s+"([^"]+)"/);
34
+ if (setPromptMatch) {
35
+ const tabName = setPromptMatch[1];
36
+ const systemPrompt = setPromptMatch[2];
37
+ const { getDb } = await import('../db/index.js');
38
+ const db = getDb();
39
+ db.prepare('UPDATE tabs SET system_prompt = ? WHERE name = ?').run(systemPrompt, tabName);
40
+ return { handled: true, response: `System prompt updated for tab "${tabName}"` };
41
+ }
42
+ const spaceIdx = rest.indexOf(' ');
43
+ if (spaceIdx === -1) {
44
+ return { handled: true, response: 'Usage: /tab <name> <message>' };
45
+ }
46
+ const tabName = rest.slice(0, spaceIdx);
47
+ const validationError = validateTabName(tabName);
48
+ if (validationError) {
49
+ return { handled: true, response: `Invalid tab name: ${validationError}` };
50
+ }
51
+ // /tab with a valid name + message — not handled here, falls through to message handling
52
+ return { handled: false };
53
+ }
54
+ // /register [name]
55
+ if (text === '/register' || text.startsWith('/register ')) {
56
+ const { resolveUser, registerUser, hasAdmin } = await import('../users/index.js');
57
+ const existing = resolveUser(ctx.channelId, userId);
58
+ if (existing) {
59
+ return { handled: true, response: `You're already registered as "${existing.name}" (${existing.role}).` };
60
+ }
61
+ const name = text.slice(10).trim() || `user-${userId}`;
62
+ const role = hasAdmin() ? 'user' : 'admin';
63
+ const user = registerUser(name, ctx.channelId, userId, role);
64
+ return { handled: true, response: `Registered as "${user.name}" (${user.role}).${role === 'admin' ? ' You are the admin.' : ''}` };
65
+ }
66
+ // /link channel:peerId
67
+ if (text.startsWith('/link ')) {
68
+ const { resolveUser, linkIdentity } = await import('../users/index.js');
69
+ const user = resolveUser(ctx.channelId, userId);
70
+ if (!user)
71
+ return { handled: true, response: 'Register first: /register' };
72
+ const parts = text.slice(6).trim().split(':');
73
+ if (parts.length !== 2) {
74
+ return { handled: true, response: 'Usage: /link channel:peerId (e.g., /link discord:123456789)' };
75
+ }
76
+ const success = linkIdentity(user.id, parts[0], parts[1]);
77
+ return { handled: true, response: success ? `Linked ${parts[0]} identity.` : 'Failed to link — already linked or invalid.' };
78
+ }
79
+ // /users (admin only)
80
+ if (text === '/users') {
81
+ if (!isAdmin)
82
+ return { handled: true, response: 'Admin only.' };
83
+ const { listUsers } = await import('../users/index.js');
84
+ const users = listUsers();
85
+ if (users.length === 0)
86
+ return { handled: true, response: 'No registered users.' };
87
+ const list = users.map(u => `• ${u.name} [${u.role}] — ${u.id.slice(0, 8)}`).join('\n');
88
+ return { handled: true, response: `${users.length} user(s):\n${list}` };
89
+ }
90
+ // /watches
91
+ if (text === '/watches' || text.startsWith('/watches@')) {
92
+ const { getDb } = await import('../db/index.js');
93
+ const db = getDb();
94
+ const watchers = db.prepare('SELECT * FROM watchers ORDER BY created_at').all();
95
+ if (watchers.length === 0)
96
+ return { handled: true, response: 'No watchers configured.' };
97
+ const watchList = watchers.map((w) => {
98
+ const status = w.enabled ? 'active' : 'disabled';
99
+ return `[${status}] ${w.name} -- ${w.schedule} (triggers: ${w.trigger_count})`;
100
+ }).join('\n');
101
+ return { handled: true, response: `Watchers:\n${watchList}` };
102
+ }
103
+ // /tasks
104
+ if (text === '/tasks' || text.startsWith('/tasks@')) {
105
+ const { getDb } = await import('../db/index.js');
106
+ const db = getDb();
107
+ const tasks = db.prepare('SELECT * FROM tasks WHERE user_id = ? ORDER BY created_at').all('local');
108
+ if (tasks.length === 0)
109
+ return { handled: true, response: 'No tasks scheduled.' };
110
+ const taskList = tasks.map((t) => {
111
+ const status = t.enabled ? 'enabled' : 'disabled';
112
+ return `[${status}] ${t.name} (${t.schedule_type}: ${t.schedule}) -> tab:${t.tab_name}`;
113
+ }).join('\n');
114
+ return { handled: true, response: `Tasks:\n${taskList}` };
115
+ }
116
+ // /cost
117
+ if (text === '/cost' || text.startsWith('/cost ')) {
118
+ const { getCostSummary, formatCostSummary } = await import('../observability/analytics.js');
119
+ return { handled: true, response: formatCostSummary(getCostSummary()) };
120
+ }
121
+ // /activity [hours]
122
+ if (text === '/activity' || text.startsWith('/activity ')) {
123
+ const hours = parseInt(text.slice(10).trim()) || 24;
124
+ const { getActivitySummary, formatActivitySummary } = await import('../observability/analytics.js');
125
+ return { handled: true, response: formatActivitySummary(getActivitySummary(hours)) };
126
+ }
127
+ // /handoff [tab]
128
+ if (text.startsWith('/handoff')) {
129
+ const tabName = text.slice(9).trim() || 'default';
130
+ const { exportTab, formatHandoffInfo } = await import('../cli/handoff.js');
131
+ const info = exportTab(tabName);
132
+ if (!info)
133
+ return { handled: true, response: `Tab "${tabName}" not found.` };
134
+ return { handled: true, response: formatHandoffInfo(info) };
135
+ }
136
+ // /machines
137
+ if (text === '/machines' || text.startsWith('/machines@')) {
138
+ const { listMachines } = await import('../machines/index.js');
139
+ const machines = listMachines();
140
+ if (machines.length === 0)
141
+ return { handled: true, response: 'No machines registered.' };
142
+ const list = machines.map(m => {
143
+ const primary = m.isPrimary ? ' ⭐' : '';
144
+ const remote = m.host ? ` (${m.sshUser}@${m.host})` : ' (local)';
145
+ const paths = m.projectPaths.slice(0, 3).join(', ');
146
+ return `• ${m.name}${primary}${remote}\n Projects: ${paths}`;
147
+ }).join('\n\n');
148
+ return { handled: true, response: `šŸ–„ ${machines.length} machine(s):\n\n${list}` };
149
+ }
150
+ // /projects
151
+ if (text === '/projects' || text.startsWith('/projects@')) {
152
+ const { listProjects } = await import('../projects/index.js');
153
+ const projects = listProjects();
154
+ if (projects.length === 0)
155
+ return { handled: true, response: 'No projects found. Create one with /newproject <name>' };
156
+ const userProjects = projects.filter((p) => p.type === 'user-project');
157
+ const categories = projects.filter((p) => p.type === 'category');
158
+ let msg = 'šŸ“¦ Projects:\n';
159
+ if (userProjects.length > 0)
160
+ msg += userProjects.map((p) => ` • ${p.name} — ${p.path}`).join('\n');
161
+ if (categories.length > 0) {
162
+ msg += '\n\nšŸ“ Categories:\n';
163
+ msg += categories.map((p) => ` • ${p.name}`).join('\n');
164
+ }
165
+ return { handled: true, response: msg };
166
+ }
167
+ // /project <name>
168
+ if (text.startsWith('/project ') && !text.startsWith('/projects')) {
169
+ const name = text.slice(9).trim();
170
+ const { getProject, setUserContext } = await import('../projects/index.js');
171
+ const project = getProject(name);
172
+ if (!project)
173
+ return { handled: true, response: `Project "${name}" not found. Use /projects to list or /newproject to create.` };
174
+ setUserContext(userId, project.name, project.name);
175
+ return { handled: true, response: `Switched to project: ${project.name}\nPath: ${project.path}\n\nNext messages will work in this project.` };
176
+ }
177
+ // /newproject <name> [path]
178
+ if (text.startsWith('/newproject ')) {
179
+ const parts = text.slice(12).trim().split(/\s+/);
180
+ const name = parts[0];
181
+ const customPath = parts[1] || undefined;
182
+ if (!name)
183
+ return { handled: true, response: 'Usage: /newproject <name> [path]' };
184
+ const { createProject, setUserContext } = await import('../projects/index.js');
185
+ const project = createProject(name, customPath);
186
+ setUserContext(userId, project.name, project.name);
187
+ return { handled: true, response: `āœ“ Project "${name}" created at ${project.path}\nSwitched to this project.` };
188
+ }
189
+ // /close <tab>
190
+ if (text.startsWith('/close ')) {
191
+ const tabNameToClose = text.slice(7).trim();
192
+ if (!tabNameToClose)
193
+ return { handled: true, response: 'Usage: /close <tabname>' };
194
+ // Stop any running subprocess before deleting records
195
+ tabManager.stopTab(tabNameToClose);
196
+ const { closeTab } = await import('../projects/index.js');
197
+ const closed = closeTab(tabNameToClose);
198
+ return { handled: true, response: closed ? `Tab "${tabNameToClose}" permanently closed. History deleted.` : `Tab "${tabNameToClose}" not found.` };
199
+ }
200
+ // /fresh <project>
201
+ if (text.startsWith('/fresh ')) {
202
+ const projectName = text.slice(7).trim();
203
+ const { getProject, setUserContext } = await import('../projects/index.js');
204
+ const project = getProject(projectName);
205
+ if (!project)
206
+ return { handled: true, response: `Project "${projectName}" not found.` };
207
+ const freshTabName = `${projectName}-${Date.now().toString(36).slice(-4)}`;
208
+ setUserContext(userId, project.name, freshTabName);
209
+ return { handled: true, response: `Fresh start in "${projectName}" (tab: ${freshTabName})\nSend your message now.` };
210
+ }
211
+ return { handled: false };
212
+ }
213
+ /**
214
+ * Shared project routing logic — resolves which tab/project to use for a message.
215
+ * Extracted from the identical blocks in Telegram, WhatsApp, and Discord channels.
216
+ */
217
+ export async function resolveProjectRoute(rawPrompt, tabName, text, userId) {
218
+ if (tabName !== 'default' || text.startsWith('/tab ')) {
219
+ return { effectiveTabName: tabName };
220
+ }
221
+ try {
222
+ const { routeMessage, setUserContext, listProjects } = await import('../projects/index.js');
223
+ const decision = routeMessage(rawPrompt, { userId });
224
+ if (decision.needsConfirmation) {
225
+ const projects = listProjects().filter((p) => p.type === 'user-project');
226
+ const options = projects.map((p, i) => `${i + 1}) ${p.name}`).join('\n');
227
+ return {
228
+ effectiveTabName: tabName,
229
+ confirmationMessage: `Which project?\n${options}\n\nReply with the number, or just send your message with /project <name> first.`,
230
+ };
231
+ }
232
+ setUserContext(userId, decision.project.name, decision.tabName);
233
+ return {
234
+ effectiveTabName: decision.tabName,
235
+ projectPath: decision.project.path,
236
+ };
237
+ }
238
+ catch {
239
+ return { effectiveTabName: tabName };
240
+ }
241
+ }
242
+ //# sourceMappingURL=command-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-handler.js","sourceRoot":"","sources":["../../src/channels/command-handler.ts"],"names":[],"mappings":"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"}
@@ -7,14 +7,14 @@ export declare class DiscordChannel implements Channel {
7
7
  readonly supportsMedia = true;
8
8
  private client;
9
9
  private ctx;
10
- private handler;
11
10
  private allowedUserIds;
12
11
  private sttProvider;
13
12
  private ttsProvider;
13
+ private sttWarmedUp;
14
14
  constructor(ctx: ChannelContext);
15
15
  start(): Promise<void>;
16
16
  stop(): void;
17
- onMessage(handler: InboundMessageHandler): void;
17
+ onMessage(_handler: InboundMessageHandler): void;
18
18
  sendMessage(peerId: string, text: string, options?: SendOptions): Promise<void>;
19
19
  sendNotification(message: string, urgent?: boolean): Promise<void>;
20
20
  setTyping(peerId: string, active: boolean): Promise<void>;