@botmem/cli 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.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,512 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const fs_1 = require("fs");
38
+ const path_1 = require("path");
39
+ const os_1 = require("os");
40
+ const client_js_1 = require("./client.js");
41
+ const format_js_1 = require("./format.js");
42
+ const search_js_1 = require("./commands/search.js");
43
+ const memories_js_1 = require("./commands/memories.js");
44
+ const contacts_js_1 = require("./commands/contacts.js");
45
+ const jobs_js_1 = require("./commands/jobs.js");
46
+ const timeline_js_1 = require("./commands/timeline.js");
47
+ const entities_js_1 = require("./commands/entities.js");
48
+ const version_js_1 = require("./commands/version.js");
49
+ const agent_js_1 = require("./commands/agent.js");
50
+ const memory_banks_js_1 = require("./commands/memory-banks.js");
51
+ const DEFAULT_API_URL = 'https://api.botmem.xyz/api';
52
+ const CONFIG_DIR = (0, path_1.join)((0, os_1.homedir)(), '.botmem');
53
+ const CONFIG_FILE = (0, path_1.join)(CONFIG_DIR, 'config.json');
54
+ function loadConfig() {
55
+ try {
56
+ return JSON.parse((0, fs_1.readFileSync)(CONFIG_FILE, 'utf-8'));
57
+ }
58
+ catch {
59
+ return {};
60
+ }
61
+ }
62
+ function saveConfig(cfg) {
63
+ (0, fs_1.mkdirSync)(CONFIG_DIR, { recursive: true });
64
+ (0, fs_1.writeFileSync)(CONFIG_FILE, JSON.stringify(cfg, null, 2), { mode: 0o600 });
65
+ }
66
+ function loadStoredToken() {
67
+ const cfg = loadConfig();
68
+ return cfg.apiKey || cfg.token || null;
69
+ }
70
+ function storeToken(token) {
71
+ const cfg = loadConfig();
72
+ cfg.token = token;
73
+ saveConfig(cfg);
74
+ }
75
+ const HELP = `
76
+ botmem -- Query and manage your personal memory system
77
+
78
+ USAGE
79
+ botmem <command> [options]
80
+
81
+ COMMANDS
82
+ login Authenticate and store token
83
+ search <query> Search memories semantically
84
+ ask <query> Natural language query (agent)
85
+ context <contactId> Full contact context (agent)
86
+ timeline Query memories by time range
87
+ related <id> Find memories related to a given memory
88
+ entities search <q> Search extracted entities (people, orgs, topics)
89
+ entities graph <value> Show entity graph with relationships
90
+ memories List recent memories
91
+ memory <id> Get or delete a memory
92
+ memory-banks Manage memory banks (list/create/rename/delete)
93
+ stats Memory count breakdown by source/connector
94
+ contacts List contacts
95
+ contacts search <query> Search contacts by name/email/phone
96
+ contact <id> Get contact details or their memories
97
+ status Dashboard overview (memories, pipeline, connectors)
98
+ version Show API build info and uptime
99
+ jobs List sync/pipeline jobs
100
+ sync <accountId> Trigger a connector sync
101
+ retry Retry all failed jobs and memories
102
+ accounts List connected accounts
103
+
104
+ SETUP
105
+ botmem config set-host <url> Set API host (e.g. localhost:12412, api.botmem.xyz)
106
+ botmem config set-key <key> Store an API key (bm_sk_...)
107
+ botmem config set-recovery-key <key> Store recovery key for E2EE
108
+ botmem config show Show current config
109
+ botmem login Log in with email/password and store JWT
110
+
111
+ GLOBAL OPTIONS
112
+ --api-key <key> API key (env: BOTMEM_API_KEY) — preferred for agents
113
+ --token <jwt> JWT token (env: BOTMEM_TOKEN) — from email/password login
114
+ --api-url <url> API base URL override (env: BOTMEM_API_URL, default: https://api.botmem.xyz/api)
115
+ --json Output raw JSON (for piping to jq or scripts)
116
+ --toon Tool-optimized output: flattened JSON for LLM agents
117
+ -h, --help Show help (use with any command for details)
118
+
119
+ EXAMPLES
120
+ botmem search "coffee with Ahmed last week"
121
+ botmem search "meeting" --connector gmail --limit 5
122
+ botmem contacts search "Amr"
123
+ botmem contact abc123 memories
124
+ botmem status
125
+ botmem sync abc123
126
+ botmem timeline --from 2025-01-01 --to 2025-01-31
127
+ botmem related abc123-def456
128
+ botmem entities search "Assad"
129
+ botmem ask "what did Ahmed say?" --json
130
+ botmem memory-banks
131
+ botmem search "project update" --json | jq '.[].text'
132
+ `.trim();
133
+ const COMMAND_HELP = {
134
+ search: search_js_1.searchHelp,
135
+ ask: agent_js_1.askHelp,
136
+ context: agent_js_1.contextHelp,
137
+ version: version_js_1.versionHelp,
138
+ 'memory-banks': memory_banks_js_1.memoryBanksHelp,
139
+ timeline: timeline_js_1.timelineHelp,
140
+ related: entities_js_1.relatedHelp,
141
+ entities: entities_js_1.entitiesHelp,
142
+ memories: `
143
+ botmem memories -- List recent memories
144
+
145
+ USAGE
146
+ botmem memories [options]
147
+
148
+ OPTIONS
149
+ --limit <n> Max results (default: 50)
150
+ --offset <n> Skip first N results
151
+ --source <type> Filter by source (email, message, photo, location)
152
+ --connector <type> Filter by connector (gmail, slack, whatsapp, imessage, locations)
153
+ --json Output raw JSON
154
+ `.trim(),
155
+ memory: `
156
+ botmem memory -- Get or delete a memory
157
+
158
+ USAGE
159
+ botmem memory <id> Get a memory by ID
160
+ botmem memory <id> delete Delete a memory
161
+ `.trim(),
162
+ stats: `
163
+ botmem stats -- Memory count breakdown
164
+
165
+ USAGE
166
+ botmem stats [--json]
167
+ `.trim(),
168
+ contacts: `
169
+ botmem contacts -- List or search contacts
170
+
171
+ USAGE
172
+ botmem contacts [options] List contacts
173
+ botmem contacts search <query> Search contacts
174
+
175
+ OPTIONS
176
+ --limit <n> Max results (default: 50)
177
+ --offset <n> Skip first N results
178
+ --json Output raw JSON
179
+ `.trim(),
180
+ contact: `
181
+ botmem contact -- Get contact details
182
+
183
+ USAGE
184
+ botmem contact <id> Get contact details
185
+ botmem contact <id> memories List contact's memories
186
+ `.trim(),
187
+ status: `
188
+ botmem status -- Dashboard overview
189
+
190
+ USAGE
191
+ botmem status [--json]
192
+ `.trim(),
193
+ jobs: `
194
+ botmem jobs -- List sync/pipeline jobs
195
+
196
+ USAGE
197
+ botmem jobs [--account <id>] [--json]
198
+ `.trim(),
199
+ sync: `
200
+ botmem sync -- Trigger a connector sync
201
+
202
+ USAGE
203
+ botmem sync <accountId>
204
+ `.trim(),
205
+ retry: `
206
+ botmem retry -- Retry all failed jobs and memories
207
+
208
+ USAGE
209
+ botmem retry [--json]
210
+ `.trim(),
211
+ accounts: `
212
+ botmem accounts -- List connected accounts
213
+
214
+ USAGE
215
+ botmem accounts [--json]
216
+ `.trim(),
217
+ };
218
+ function parseGlobalArgs(argv) {
219
+ const storedCfg = loadConfig();
220
+ let apiUrl = process.env['BOTMEM_API_URL'] || storedCfg.apiUrl || DEFAULT_API_URL;
221
+ let token = process.env['BOTMEM_API_KEY'] || process.env['BOTMEM_TOKEN'] || '';
222
+ let json = false;
223
+ let toon = false;
224
+ let help = false;
225
+ const rest = [];
226
+ for (let i = 0; i < argv.length; i++) {
227
+ const a = argv[i];
228
+ if (a === '--api-url') {
229
+ apiUrl = argv[++i];
230
+ }
231
+ else if (a === '--api-key') {
232
+ token = argv[++i];
233
+ }
234
+ else if (a === '--token') {
235
+ token = argv[++i];
236
+ }
237
+ else if (a === '--json') {
238
+ json = true;
239
+ }
240
+ else if (a === '--toon') {
241
+ toon = true;
242
+ json = true; // toon implies json
243
+ }
244
+ else if (a === '--help' || a === '-h') {
245
+ help = true;
246
+ }
247
+ else {
248
+ rest.push(a);
249
+ }
250
+ }
251
+ // Resolve: explicit flag > env var > stored config
252
+ if (!token)
253
+ token = loadStoredToken() || '';
254
+ return { apiUrl, token, json, toon, help, rest };
255
+ }
256
+ const configHelp = `
257
+ botmem config -- Manage CLI configuration
258
+
259
+ USAGE
260
+ botmem config show Show current config
261
+ botmem config set-host <url> Set API host (e.g. localhost:12412, api.botmem.xyz)
262
+ botmem config set-key <key> Store API key (bm_sk_...)
263
+ botmem config set-recovery-key <k> Store recovery key for E2EE
264
+ botmem config clear Reset config to defaults
265
+
266
+ EXAMPLES
267
+ botmem config set-host localhost:12412
268
+ botmem config set-host api.botmem.xyz
269
+ botmem config set-key bm_sk_abc123def456
270
+ botmem config set-recovery-key oasULlqb...
271
+ botmem config show
272
+ `.trim();
273
+ function runConfig(args) {
274
+ const sub = args[0];
275
+ if (sub === 'show' || !sub) {
276
+ const cfg = loadConfig();
277
+ console.log(`Config: ${CONFIG_FILE}`);
278
+ console.log(` Host: ${cfg.apiUrl || DEFAULT_API_URL} ${!cfg.apiUrl ? '(default)' : ''}`);
279
+ console.log(` API Key: ${cfg.apiKey ? cfg.apiKey.slice(0, 10) + '...' + cfg.apiKey.slice(-4) : '(not set)'}`);
280
+ console.log(` Token: ${cfg.token ? '(set)' : '(not set)'}`);
281
+ console.log(` Recovery Key: ${cfg.recoveryKey ? '(set)' : '(not set)'}`);
282
+ return;
283
+ }
284
+ if (sub === 'set-host') {
285
+ let host = args[1];
286
+ if (!host) {
287
+ console.error('Error: set-host requires a URL\n');
288
+ console.log(configHelp);
289
+ process.exit(1);
290
+ }
291
+ // Normalize: add https:// if no scheme, add /api suffix if missing
292
+ if (!host.startsWith('http://') && !host.startsWith('https://')) {
293
+ // localhost or 127.0.0.1 → http, everything else → https
294
+ const isLocal = host.startsWith('localhost') || host.startsWith('127.0.0.1');
295
+ host = `${isLocal ? 'http' : 'https'}://${host}`;
296
+ }
297
+ if (!host.endsWith('/api')) {
298
+ host = host.replace(/\/+$/, '') + '/api';
299
+ }
300
+ const cfg = loadConfig();
301
+ cfg.apiUrl = host;
302
+ saveConfig(cfg);
303
+ console.log(`API URL set to ${host}`);
304
+ return;
305
+ }
306
+ if (sub === 'set-key') {
307
+ const key = args[1];
308
+ if (!key) {
309
+ console.error('Error: set-key requires an API key\n');
310
+ console.log(configHelp);
311
+ process.exit(1);
312
+ }
313
+ const cfg = loadConfig();
314
+ cfg.apiKey = key;
315
+ saveConfig(cfg);
316
+ console.log(`API key stored (${key.slice(0, 10)}...${key.slice(-4)})`);
317
+ return;
318
+ }
319
+ if (sub === 'set-recovery-key') {
320
+ const key = args[1];
321
+ if (!key) {
322
+ console.error('Error: set-recovery-key requires a recovery key\n');
323
+ console.log(configHelp);
324
+ process.exit(1);
325
+ }
326
+ const cfg = loadConfig();
327
+ cfg.recoveryKey = key;
328
+ saveConfig(cfg);
329
+ console.log('Recovery key stored');
330
+ return;
331
+ }
332
+ if (sub === 'clear') {
333
+ saveConfig({});
334
+ console.log('Config cleared');
335
+ return;
336
+ }
337
+ console.error(`Unknown config command: ${sub}\n`);
338
+ console.log(configHelp);
339
+ process.exit(1);
340
+ }
341
+ async function runStatus(client, json) {
342
+ const [stats, queues, { accounts }] = await Promise.all([
343
+ client.getMemoryStats(),
344
+ client.getQueueStats(),
345
+ client.listAccounts(),
346
+ ]);
347
+ if (json) {
348
+ console.log(JSON.stringify({ stats, queues, accounts }, null, 2));
349
+ }
350
+ else {
351
+ console.log((0, format_js_1.formatStatus)(stats, queues, accounts));
352
+ }
353
+ }
354
+ async function runLogin(client, args) {
355
+ // Accept email/password as positional args or prompt-style from env
356
+ let email = args[0] || process.env['BOTMEM_EMAIL'] || '';
357
+ let password = args[1] || process.env['BOTMEM_PASSWORD'] || '';
358
+ if (!email || !password) {
359
+ // Read from stdin if not provided
360
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
361
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
362
+ const ask = (q) => new Promise(r => rl.question(q, r));
363
+ if (!email)
364
+ email = await ask('Email: ');
365
+ if (!password)
366
+ password = await ask('Password: ');
367
+ rl.close();
368
+ }
369
+ const result = await client.login(email, password);
370
+ storeToken(result.accessToken);
371
+ console.log(`Logged in as ${result.user.name} (${result.user.email})`);
372
+ console.log(`Token stored in ${CONFIG_FILE}`);
373
+ }
374
+ async function main() {
375
+ const argv = process.argv.slice(2);
376
+ const { apiUrl, token, json, toon, help, rest } = parseGlobalArgs(argv);
377
+ // --toon: intercept JSON output and flatten for LLM consumption
378
+ if (toon) {
379
+ const origLog = console.log.bind(console);
380
+ console.log = (...args) => {
381
+ if (args.length === 1 && typeof args[0] === 'string') {
382
+ try {
383
+ const parsed = JSON.parse(args[0]);
384
+ origLog((0, format_js_1.toonify)(parsed));
385
+ return;
386
+ }
387
+ catch { /* not JSON, pass through */ }
388
+ }
389
+ origLog(...args);
390
+ };
391
+ }
392
+ const command = rest[0];
393
+ const commandArgs = rest.slice(1);
394
+ if (help && !command) {
395
+ console.log(HELP);
396
+ return;
397
+ }
398
+ if (help && command && COMMAND_HELP[command]) {
399
+ console.log(COMMAND_HELP[command]);
400
+ return;
401
+ }
402
+ if (!command) {
403
+ console.log(HELP);
404
+ return;
405
+ }
406
+ const client = new client_js_1.BotmemClient(apiUrl);
407
+ if (token)
408
+ client.setToken(token);
409
+ // Auto-submit recovery key if stored (needed for E2EE decryption)
410
+ const storedCfg = loadConfig();
411
+ if (token && storedCfg.recoveryKey) {
412
+ try {
413
+ await client.submitRecoveryKey(storedCfg.recoveryKey);
414
+ }
415
+ catch {
416
+ // Non-fatal — key may already be cached server-side
417
+ }
418
+ }
419
+ try {
420
+ switch (command) {
421
+ case 'config':
422
+ if (help) {
423
+ console.log(configHelp);
424
+ return;
425
+ }
426
+ runConfig(commandArgs);
427
+ return;
428
+ case 'login':
429
+ await runLogin(client, commandArgs);
430
+ return;
431
+ case 'version':
432
+ await (0, version_js_1.runVersion)(client, json);
433
+ break;
434
+ case 'ask':
435
+ await (0, agent_js_1.runAsk)(client, commandArgs, json);
436
+ break;
437
+ case 'context':
438
+ await (0, agent_js_1.runContext)(client, commandArgs, json);
439
+ break;
440
+ case 'memory-banks':
441
+ await (0, memory_banks_js_1.runMemoryBanks)(client, commandArgs, json);
442
+ break;
443
+ case 'search':
444
+ if (help) {
445
+ console.log(COMMAND_HELP['search']);
446
+ return;
447
+ }
448
+ await (0, search_js_1.runSearch)(client, commandArgs, json);
449
+ break;
450
+ case 'memories':
451
+ await (0, memories_js_1.runMemories)(client, commandArgs, json);
452
+ break;
453
+ case 'memory':
454
+ await (0, memories_js_1.runMemory)(client, commandArgs, json);
455
+ break;
456
+ case 'stats':
457
+ await (0, memories_js_1.runStats)(client, json);
458
+ break;
459
+ case 'contacts':
460
+ await (0, contacts_js_1.runContacts)(client, commandArgs, json);
461
+ break;
462
+ case 'contact':
463
+ await (0, contacts_js_1.runContact)(client, commandArgs, json);
464
+ break;
465
+ case 'status':
466
+ await runStatus(client, json);
467
+ break;
468
+ case 'jobs':
469
+ await (0, jobs_js_1.runJobs)(client, commandArgs, json);
470
+ break;
471
+ case 'sync':
472
+ await (0, jobs_js_1.runSync)(client, commandArgs, json);
473
+ break;
474
+ case 'retry':
475
+ await (0, jobs_js_1.runRetry)(client, json);
476
+ break;
477
+ case 'accounts':
478
+ await (0, jobs_js_1.runAccounts)(client, json);
479
+ break;
480
+ case 'timeline':
481
+ await (0, timeline_js_1.runTimeline)(client, commandArgs, json);
482
+ break;
483
+ case 'related':
484
+ await (0, entities_js_1.runRelated)(client, commandArgs, json);
485
+ break;
486
+ case 'entities':
487
+ await (0, entities_js_1.runEntities)(client, commandArgs, json);
488
+ break;
489
+ default:
490
+ console.error(`Unknown command: ${command}\n`);
491
+ console.log(HELP);
492
+ process.exit(1);
493
+ }
494
+ }
495
+ catch (err) {
496
+ if (err instanceof client_js_1.BotmemApiError) {
497
+ if (err.status === 0) {
498
+ console.error(`Error: Cannot connect to Botmem API at ${apiUrl}`);
499
+ console.error('Make sure the API server is running (pnpm dev)');
500
+ }
501
+ else {
502
+ console.error(`Error: API returned ${err.status} — ${err.message}`);
503
+ if (err.body)
504
+ console.error(JSON.stringify(err.body, null, 2));
505
+ }
506
+ process.exit(1);
507
+ }
508
+ throw err;
509
+ }
510
+ }
511
+ main();
512
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}