@wastedcode/memex 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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +291 -0
  3. package/dist/cli/client.d.ts +35 -0
  4. package/dist/cli/client.js +183 -0
  5. package/dist/cli/client.js.map +1 -0
  6. package/dist/cli/commands/chown.d.ts +2 -0
  7. package/dist/cli/commands/chown.js +22 -0
  8. package/dist/cli/commands/chown.js.map +1 -0
  9. package/dist/cli/commands/config.d.ts +2 -0
  10. package/dist/cli/commands/config.js +132 -0
  11. package/dist/cli/commands/config.js.map +1 -0
  12. package/dist/cli/commands/create.d.ts +2 -0
  13. package/dist/cli/commands/create.js +21 -0
  14. package/dist/cli/commands/create.js.map +1 -0
  15. package/dist/cli/commands/destroy.d.ts +2 -0
  16. package/dist/cli/commands/destroy.js +34 -0
  17. package/dist/cli/commands/destroy.js.map +1 -0
  18. package/dist/cli/commands/ingest.d.ts +2 -0
  19. package/dist/cli/commands/ingest.js +74 -0
  20. package/dist/cli/commands/ingest.js.map +1 -0
  21. package/dist/cli/commands/lint.d.ts +2 -0
  22. package/dist/cli/commands/lint.js +46 -0
  23. package/dist/cli/commands/lint.js.map +1 -0
  24. package/dist/cli/commands/list.d.ts +2 -0
  25. package/dist/cli/commands/list.js +28 -0
  26. package/dist/cli/commands/list.js.map +1 -0
  27. package/dist/cli/commands/login.d.ts +2 -0
  28. package/dist/cli/commands/login.js +51 -0
  29. package/dist/cli/commands/login.js.map +1 -0
  30. package/dist/cli/commands/logs.d.ts +2 -0
  31. package/dist/cli/commands/logs.js +26 -0
  32. package/dist/cli/commands/logs.js.map +1 -0
  33. package/dist/cli/commands/query.d.ts +2 -0
  34. package/dist/cli/commands/query.js +48 -0
  35. package/dist/cli/commands/query.js.map +1 -0
  36. package/dist/cli/commands/serve.d.ts +2 -0
  37. package/dist/cli/commands/serve.js +14 -0
  38. package/dist/cli/commands/serve.js.map +1 -0
  39. package/dist/cli/commands/status.d.ts +2 -0
  40. package/dist/cli/commands/status.js +66 -0
  41. package/dist/cli/commands/status.js.map +1 -0
  42. package/dist/daemon/auth.d.ts +31 -0
  43. package/dist/daemon/auth.js +84 -0
  44. package/dist/daemon/auth.js.map +1 -0
  45. package/dist/daemon/db.d.ts +36 -0
  46. package/dist/daemon/db.js +181 -0
  47. package/dist/daemon/db.js.map +1 -0
  48. package/dist/daemon/namespace.d.ts +34 -0
  49. package/dist/daemon/namespace.js +74 -0
  50. package/dist/daemon/namespace.js.map +1 -0
  51. package/dist/daemon/peercred.d.ts +15 -0
  52. package/dist/daemon/peercred.js +19 -0
  53. package/dist/daemon/peercred.js.map +1 -0
  54. package/dist/daemon/queue.d.ts +26 -0
  55. package/dist/daemon/queue.js +126 -0
  56. package/dist/daemon/queue.js.map +1 -0
  57. package/dist/daemon/routes.d.ts +38 -0
  58. package/dist/daemon/routes.js +258 -0
  59. package/dist/daemon/routes.js.map +1 -0
  60. package/dist/daemon/runner.d.ts +25 -0
  61. package/dist/daemon/runner.js +195 -0
  62. package/dist/daemon/runner.js.map +1 -0
  63. package/dist/daemon/scaffold.d.ts +38 -0
  64. package/dist/daemon/scaffold.js +141 -0
  65. package/dist/daemon/scaffold.js.map +1 -0
  66. package/dist/daemon/server.d.ts +11 -0
  67. package/dist/daemon/server.js +145 -0
  68. package/dist/daemon/server.js.map +1 -0
  69. package/dist/daemon.d.ts +1 -0
  70. package/dist/daemon.js +55 -0
  71. package/dist/daemon.js.map +1 -0
  72. package/dist/index.d.ts +2 -0
  73. package/dist/index.js +36 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/lib/constants.d.ts +17 -0
  76. package/dist/lib/constants.js +30 -0
  77. package/dist/lib/constants.js.map +1 -0
  78. package/dist/lib/errors.d.ts +32 -0
  79. package/dist/lib/errors.js +64 -0
  80. package/dist/lib/errors.js.map +1 -0
  81. package/dist/lib/prompts/ingest.d.ts +9 -0
  82. package/dist/lib/prompts/ingest.js +48 -0
  83. package/dist/lib/prompts/ingest.js.map +1 -0
  84. package/dist/lib/prompts/lint.d.ts +8 -0
  85. package/dist/lib/prompts/lint.js +62 -0
  86. package/dist/lib/prompts/lint.js.map +1 -0
  87. package/dist/lib/prompts/query.d.ts +8 -0
  88. package/dist/lib/prompts/query.js +37 -0
  89. package/dist/lib/prompts/query.js.map +1 -0
  90. package/dist/lib/prompts/wiki.d.ts +11 -0
  91. package/dist/lib/prompts/wiki.js +112 -0
  92. package/dist/lib/prompts/wiki.js.map +1 -0
  93. package/dist/lib/types.d.ts +76 -0
  94. package/dist/lib/types.js +3 -0
  95. package/dist/lib/types.js.map +1 -0
  96. package/dist/standalone/memex.mjs +2313 -0
  97. package/dist/standalone/memex.mjs.map +7 -0
  98. package/package.json +54 -0
@@ -0,0 +1,132 @@
1
+ import { Command } from 'commander';
2
+ import { createInterface } from 'node:readline';
3
+ import { execFileSync } from 'node:child_process';
4
+ import { MemexClient } from '../client.js';
5
+ import { WIKIS_DIR, ALLOWED_TOOLS_WHITELIST, BASE_ALLOWED_TOOLS } from '../../lib/constants.js';
6
+ import { join } from 'node:path';
7
+ export const configCommand = new Command('config')
8
+ .description('Configure a wiki')
9
+ .argument('<wikiId>', 'Wiki to configure')
10
+ .option('--edit', 'Open .claude.md in $EDITOR')
11
+ .option('--set-key', 'Set the API key for this wiki')
12
+ .option('--model <model>', 'Set the default model (e.g., sonnet, opus, haiku)')
13
+ .option('--allowed-tools <tools>', 'Set allowed tools (comma-separated, e.g., WebSearch,WebFetch)')
14
+ .option('--list-tools', 'Show available tools and current configuration')
15
+ .action(async (wikiId, opts) => {
16
+ const client = new MemexClient();
17
+ // Verify wiki exists
18
+ const wikiResp = await client.getWiki(wikiId);
19
+ if (!wikiResp.ok) {
20
+ console.error(`Error: ${wikiResp.error}`);
21
+ process.exit(1);
22
+ }
23
+ if (opts.edit) {
24
+ const editor = process.env['EDITOR'] || process.env['VISUAL'] || 'vi';
25
+ const claudeMdPath = join(WIKIS_DIR, wikiId, '.claude.md');
26
+ try {
27
+ execFileSync(editor, [claudeMdPath], { stdio: 'inherit' });
28
+ console.log(`Updated .claude.md for '${wikiId}'`);
29
+ }
30
+ catch {
31
+ console.error(`Failed to open editor. Set $EDITOR environment variable.`);
32
+ process.exit(1);
33
+ }
34
+ return;
35
+ }
36
+ if (opts.setKey) {
37
+ const key = await promptSecret('API key: ');
38
+ const resp = await client.setApiKey(wikiId, key);
39
+ if (!resp.ok) {
40
+ console.error(`Error: ${resp.error}`);
41
+ process.exit(1);
42
+ }
43
+ console.log(`API key set for '${wikiId}'`);
44
+ return;
45
+ }
46
+ if (opts.listTools) {
47
+ const extras = [...ALLOWED_TOOLS_WHITELIST].filter(t => !BASE_ALLOWED_TOOLS.includes(t));
48
+ console.log(`Base tools (always enabled): ${BASE_ALLOWED_TOOLS.join(', ')}`);
49
+ console.log(`Available extras: ${extras.join(', ')}`);
50
+ console.log(`\nTo enable extras: memex config ${wikiId} --allowed-tools ${extras.join(',')}`);
51
+ return;
52
+ }
53
+ if (opts.allowedTools !== undefined) {
54
+ const tools = opts.allowedTools
55
+ ? opts.allowedTools.split(',').map(t => t.trim()).filter(Boolean)
56
+ : [];
57
+ const resp = await client.updateConfig(wikiId, { allowed_tools: tools });
58
+ if (!resp.ok) {
59
+ console.error(`Error: ${resp.error}`);
60
+ process.exit(1);
61
+ }
62
+ if (tools.length === 0) {
63
+ console.log(`Allowed tools reset to base set for '${wikiId}'`);
64
+ }
65
+ else {
66
+ console.log(`Allowed tools set for '${wikiId}': ${tools.join(', ')}`);
67
+ }
68
+ return;
69
+ }
70
+ if (opts.model) {
71
+ const resp = await client.updateConfig(wikiId, { default_model: opts.model });
72
+ if (!resp.ok) {
73
+ console.error(`Error: ${resp.error}`);
74
+ process.exit(1);
75
+ }
76
+ console.log(`Model set to '${opts.model}' for '${wikiId}'`);
77
+ return;
78
+ }
79
+ // No option specified — show current config
80
+ const wiki = wikiResp.data;
81
+ console.log(`Wiki: ${wiki.id}`);
82
+ console.log(`Name: ${wiki.name}`);
83
+ console.log(`Model: ${wiki.default_model}`);
84
+ console.log(`Created: ${wiki.created_at}`);
85
+ console.log(`\nConfig file: ${join(WIKIS_DIR, wikiId, '.claude.md')}`);
86
+ });
87
+ function promptSecret(prompt) {
88
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
89
+ return new Promise((resolve) => {
90
+ // Disable echo for secret input
91
+ if (process.stdin.isTTY) {
92
+ process.stdout.write(prompt);
93
+ const stdin = process.stdin;
94
+ stdin.setRawMode(true);
95
+ stdin.resume();
96
+ let input = '';
97
+ const onData = (chunk) => {
98
+ const char = chunk.toString('utf-8');
99
+ if (char === '\n' || char === '\r') {
100
+ stdin.setRawMode(false);
101
+ stdin.removeListener('data', onData);
102
+ process.stdout.write('\n');
103
+ rl.close();
104
+ resolve(input);
105
+ }
106
+ else if (char === '\x7f' || char === '\x08') {
107
+ // Backspace
108
+ if (input.length > 0) {
109
+ input = input.slice(0, -1);
110
+ }
111
+ }
112
+ else if (char === '\x03') {
113
+ // Ctrl+C
114
+ rl.close();
115
+ process.exit(0);
116
+ }
117
+ else {
118
+ input += char;
119
+ }
120
+ };
121
+ stdin.on('data', onData);
122
+ }
123
+ else {
124
+ // Non-TTY (piped input)
125
+ rl.question(prompt, (answer) => {
126
+ rl.close();
127
+ resolve(answer);
128
+ });
129
+ }
130
+ });
131
+ }
132
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const createCommand: Command;
@@ -0,0 +1,21 @@
1
+ import { Command } from 'commander';
2
+ import { MemexClient } from '../client.js';
3
+ export const createCommand = new Command('create')
4
+ .description('Create a new wiki')
5
+ .argument('<wikiId>', 'Wiki identifier (lowercase alphanumeric + hyphens, 3-64 chars)')
6
+ .option('--name <name>', 'Display name for the wiki')
7
+ .action(async (wikiId, opts) => {
8
+ const client = new MemexClient();
9
+ const resp = await client.createWiki(wikiId, opts.name);
10
+ if (!resp.ok) {
11
+ console.error(`Error: ${resp.error}`);
12
+ process.exit(1);
13
+ }
14
+ const wiki = resp.data;
15
+ console.log(`Created wiki '${wiki.id}' (${wiki.name})`);
16
+ console.log(`\nNext steps:`);
17
+ console.log(` memex login ${wiki.id} # authenticate with Claude`);
18
+ console.log(` memex config ${wiki.id} --edit # customize wiki agent`);
19
+ console.log(` memex ingest ${wiki.id} file.md # add content`);
20
+ });
21
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,mBAAmB,CAAC;KAChC,QAAQ,CAAC,UAAU,EAAE,gEAAgE,CAAC;KACtF,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAuB,EAAE,EAAE;IACxD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAExD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAwD,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,EAAE,uCAAuC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,EAAE,mCAAmC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,EAAE,0BAA0B,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const destroyCommand: Command;
@@ -0,0 +1,34 @@
1
+ import { Command } from 'commander';
2
+ import { createInterface } from 'node:readline';
3
+ import { MemexClient } from '../client.js';
4
+ export const destroyCommand = new Command('destroy')
5
+ .description('Destroy a wiki and its data')
6
+ .argument('<wikiId>', 'Wiki to destroy')
7
+ .option('--keep-data', 'Keep wiki files on disk (only remove registration)')
8
+ .option('-y, --yes', 'Skip confirmation prompt')
9
+ .action(async (wikiId, opts) => {
10
+ if (!opts.yes) {
11
+ const confirmed = await confirm(`This will destroy wiki '${wikiId}'${opts.keepData ? ' (keeping data)' : ' and ALL its data'}. Continue? [y/N] `);
12
+ if (!confirmed) {
13
+ console.log('Aborted.');
14
+ process.exit(0);
15
+ }
16
+ }
17
+ const client = new MemexClient();
18
+ const resp = await client.destroyWiki(wikiId, opts.keepData ?? false);
19
+ if (!resp.ok) {
20
+ console.error(`Error: ${resp.error}`);
21
+ process.exit(1);
22
+ }
23
+ console.log(`Destroyed wiki '${wikiId}'${opts.keepData ? ' (data preserved)' : ''}`);
24
+ });
25
+ function confirm(question) {
26
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
27
+ return new Promise((resolve) => {
28
+ rl.question(question, (answer) => {
29
+ rl.close();
30
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
31
+ });
32
+ });
33
+ }
34
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../../src/cli/commands/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,6BAA6B,CAAC;KAC1C,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;KACvC,MAAM,CAAC,aAAa,EAAE,oDAAoD,CAAC;KAC3E,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAA2C,EAAE,EAAE;IAC5E,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,2BAA2B,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,oBAAoB,CACjH,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;IAEtE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACvF,CAAC,CAAC,CAAC;AAEL,SAAS,OAAO,CAAC,QAAgB;IAC/B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const ingestCommand: Command;
@@ -0,0 +1,74 @@
1
+ import { Command } from 'commander';
2
+ import { existsSync } from 'node:fs';
3
+ import { MemexClient } from '../client.js';
4
+ export const ingestCommand = new Command('ingest')
5
+ .description('Ingest source files into a wiki')
6
+ .argument('<wikiId>', 'Target wiki')
7
+ .argument('<files...>', 'Files to ingest (pdf, md, html, txt, images, etc.)')
8
+ .option('--async', 'Return job ID immediately instead of waiting')
9
+ .action(async (wikiId, files, opts) => {
10
+ const client = new MemexClient();
11
+ // Validate files exist locally
12
+ for (const file of files) {
13
+ if (!existsSync(file)) {
14
+ console.error(`File not found: ${file}`);
15
+ process.exit(1);
16
+ }
17
+ }
18
+ // Upload each file to the daemon
19
+ const storedFiles = [];
20
+ for (const file of files) {
21
+ process.stdout.write(`Uploading ${file}...`);
22
+ const resp = await client.uploadFile(wikiId, file);
23
+ if (!resp.ok) {
24
+ console.error(` failed: ${resp.error}`);
25
+ process.exit(1);
26
+ }
27
+ storedFiles.push(resp.data.filename);
28
+ console.log(` done (${resp.data.filename})`);
29
+ }
30
+ // Submit ingest job
31
+ const jobResp = await client.submitJob(wikiId, 'ingest', { files: storedFiles });
32
+ if (!jobResp.ok) {
33
+ console.error(`Error: ${jobResp.error}`);
34
+ process.exit(1);
35
+ }
36
+ const job = jobResp.data;
37
+ console.log(`\nIngest job #${job.id} submitted`);
38
+ if (opts.async) {
39
+ console.log(`Check status: memex status ${wikiId} ${job.id}`);
40
+ return;
41
+ }
42
+ // Wait for completion
43
+ process.stdout.write('Processing');
44
+ const result = await client.waitForJob(wikiId, job.id, () => {
45
+ process.stdout.write('.');
46
+ });
47
+ console.log();
48
+ if (result.status === 'completed') {
49
+ const parsed = safeParseResult(result.result);
50
+ console.log('\nIngest complete.');
51
+ if (parsed?.output) {
52
+ console.log(parsed.output);
53
+ }
54
+ }
55
+ else {
56
+ console.error('\nIngest failed.');
57
+ const parsed = safeParseResult(result.result);
58
+ if (parsed) {
59
+ console.error(parsed.error ?? parsed.output ?? result.result);
60
+ }
61
+ process.exit(1);
62
+ }
63
+ });
64
+ function safeParseResult(raw) {
65
+ if (!raw)
66
+ return null;
67
+ try {
68
+ return JSON.parse(raw);
69
+ }
70
+ catch {
71
+ return { output: raw };
72
+ }
73
+ }
74
+ //# sourceMappingURL=ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../../src/cli/commands/ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const lintCommand: Command;
@@ -0,0 +1,46 @@
1
+ import { Command } from 'commander';
2
+ import { MemexClient } from '../client.js';
3
+ export const lintCommand = new Command('lint')
4
+ .description('Run a maintenance health check on a wiki')
5
+ .argument('<wikiId>', 'Target wiki')
6
+ .option('--async', 'Return job ID immediately instead of waiting')
7
+ .action(async (wikiId, opts) => {
8
+ const client = new MemexClient();
9
+ const jobResp = await client.submitJob(wikiId, 'lint', {});
10
+ if (!jobResp.ok) {
11
+ console.error(`Error: ${jobResp.error}`);
12
+ process.exit(1);
13
+ }
14
+ const job = jobResp.data;
15
+ if (opts.async) {
16
+ console.log(`Lint job #${job.id} submitted`);
17
+ console.log(`Check status: memex status ${wikiId} ${job.id}`);
18
+ return;
19
+ }
20
+ process.stdout.write('Checking wiki health');
21
+ const result = await client.waitForJob(wikiId, job.id, () => {
22
+ process.stdout.write('.');
23
+ });
24
+ console.log('\n');
25
+ if (result.status === 'completed') {
26
+ const parsed = safeParseResult(result.result);
27
+ console.log(parsed?.output ?? result.result ?? '(no output)');
28
+ }
29
+ else {
30
+ console.error('Lint failed.');
31
+ const parsed = safeParseResult(result.result);
32
+ console.error(parsed?.error ?? parsed?.output ?? result.result);
33
+ process.exit(1);
34
+ }
35
+ });
36
+ function safeParseResult(raw) {
37
+ if (!raw)
38
+ return null;
39
+ try {
40
+ return JSON.parse(raw);
41
+ }
42
+ catch {
43
+ return { output: raw };
44
+ }
45
+ }
46
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/cli/commands/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,0CAA0C,CAAC;KACvD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;KACnC,MAAM,CAAC,SAAS,EAAE,8CAA8C,CAAC;KACjE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAyB,EAAE,EAAE;IAC1D,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,IAAK,CAAC;IAE1B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE;QAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAElB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS,eAAe,CAAC,GAAkB;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const listCommand: Command;
@@ -0,0 +1,28 @@
1
+ import { Command } from 'commander';
2
+ import { MemexClient } from '../client.js';
3
+ export const listCommand = new Command('list')
4
+ .description('List all wikis')
5
+ .action(async () => {
6
+ const client = new MemexClient();
7
+ const resp = await client.listWikis();
8
+ if (!resp.ok) {
9
+ console.error(`Error: ${resp.error}`);
10
+ process.exit(1);
11
+ }
12
+ const wikis = (resp.data ?? []);
13
+ if (wikis.length === 0) {
14
+ console.log('No wikis. Create one with: memex create <wikiId>');
15
+ return;
16
+ }
17
+ // Print as table
18
+ const header = padRow('ID', 'NAME', 'MODEL', 'CREATED');
19
+ console.log(header);
20
+ console.log('-'.repeat(header.length));
21
+ for (const wiki of wikis) {
22
+ console.log(padRow(wiki.id, wiki.name, wiki.default_model, wiki.created_at));
23
+ }
24
+ });
25
+ function padRow(id, name, model, created) {
26
+ return `${id.padEnd(24)} ${name.padEnd(24)} ${model.padEnd(10)} ${created}`;
27
+ }
28
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IAEtC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAW,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS,MAAM,CAAC,EAAU,EAAE,IAAY,EAAE,KAAa,EAAE,OAAe;IACtE,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const loginCommand: Command;
@@ -0,0 +1,51 @@
1
+ import { Command } from 'commander';
2
+ import { readFileSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { MemexClient } from '../client.js';
6
+ const DEFAULT_CREDS_PATH = join(homedir(), '.claude', '.credentials.json');
7
+ export const loginCommand = new Command('login')
8
+ .description('Copy Claude credentials into a wiki')
9
+ .argument('<wikiId>', 'Wiki to authenticate')
10
+ .option('--credentials <path>', 'Path to .credentials.json', DEFAULT_CREDS_PATH)
11
+ .option('--api-key <key>', 'Use an API key instead of OAuth credentials')
12
+ .action(async (wikiId, opts) => {
13
+ const client = new MemexClient();
14
+ const wikiResp = await client.getWiki(wikiId);
15
+ if (!wikiResp.ok) {
16
+ console.error(`Error: ${wikiResp.error}`);
17
+ process.exit(1);
18
+ }
19
+ // API key mode
20
+ if (opts.apiKey) {
21
+ const resp = await client.setApiKey(wikiId, opts.apiKey);
22
+ if (!resp.ok) {
23
+ console.error(`Error: ${resp.error}`);
24
+ process.exit(1);
25
+ }
26
+ console.log(`API key stored for wiki '${wikiId}'.`);
27
+ return;
28
+ }
29
+ // Credentials file mode (default)
30
+ const credsPath = opts.credentials;
31
+ if (!existsSync(credsPath)) {
32
+ console.error(`Error: Credentials file not found: ${credsPath}`);
33
+ console.error(`\nRun 'claude auth login' first, or pass --credentials <path>`);
34
+ process.exit(1);
35
+ }
36
+ const credentials = readFileSync(credsPath, 'utf-8');
37
+ try {
38
+ JSON.parse(credentials);
39
+ }
40
+ catch {
41
+ console.error(`Error: ${credsPath} is not valid JSON`);
42
+ process.exit(1);
43
+ }
44
+ const resp = await client.setCredentials(wikiId, credentials);
45
+ if (!resp.ok) {
46
+ console.error(`Error: ${resp.error}`);
47
+ process.exit(1);
48
+ }
49
+ console.log(`Credentials copied from ${credsPath} to wiki '${wikiId}'.`);
50
+ });
51
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,qCAAqC,CAAC;KAClD,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;KAC5C,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,EAAE,kBAAkB,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAA8C,EAAE,EAAE;IAC/E,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,eAAe;IACf,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,IAAI,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,UAAU,SAAS,oBAAoB,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,aAAa,MAAM,IAAI,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const logsCommand: Command;
@@ -0,0 +1,26 @@
1
+ import { Command } from 'commander';
2
+ import { MemexClient } from '../client.js';
3
+ export const logsCommand = new Command('logs')
4
+ .description('View audit log for a wiki')
5
+ .argument('<wikiId>', 'Target wiki')
6
+ .option('--tail <n>', 'Number of entries to show', '20')
7
+ .action(async (wikiId, opts) => {
8
+ const client = new MemexClient();
9
+ const limit = parseInt(opts.tail, 10) || 20;
10
+ const resp = await client.getAuditLog(wikiId, limit);
11
+ if (!resp.ok) {
12
+ console.error(`Error: ${resp.error}`);
13
+ process.exit(1);
14
+ }
15
+ const entries = (resp.data ?? []);
16
+ if (entries.length === 0) {
17
+ console.log('No audit log entries.');
18
+ return;
19
+ }
20
+ // Print in chronological order (API returns newest first)
21
+ for (const entry of entries.reverse()) {
22
+ const detail = entry.detail ? ` — ${entry.detail}` : '';
23
+ console.log(`[${entry.created_at}] ${entry.action}${detail}`);
24
+ }
25
+ });
26
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,2BAA2B,CAAC;KACxC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;KACnC,MAAM,CAAC,YAAY,EAAE,2BAA2B,EAAE,IAAI,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAsB,EAAE,EAAE;IACvD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAE5C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAiB,CAAC;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,0DAA0D;IAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const queryCommand: Command;
@@ -0,0 +1,48 @@
1
+ import { Command } from 'commander';
2
+ import { MemexClient } from '../client.js';
3
+ export const queryCommand = new Command('query')
4
+ .description('Ask a question against a wiki')
5
+ .argument('<wikiId>', 'Target wiki')
6
+ .argument('<question>', 'Question to ask')
7
+ .option('--async', 'Return job ID immediately instead of waiting')
8
+ .action(async (wikiId, question, opts) => {
9
+ const client = new MemexClient();
10
+ const jobResp = await client.submitJob(wikiId, 'query', { question });
11
+ if (!jobResp.ok) {
12
+ console.error(`Error: ${jobResp.error}`);
13
+ process.exit(1);
14
+ }
15
+ const job = jobResp.data;
16
+ if (opts.async) {
17
+ console.log(`Query job #${job.id} submitted`);
18
+ console.log(`Check status: memex status ${wikiId} ${job.id}`);
19
+ return;
20
+ }
21
+ // Wait for completion
22
+ process.stdout.write('Thinking');
23
+ const result = await client.waitForJob(wikiId, job.id, () => {
24
+ process.stdout.write('.');
25
+ });
26
+ console.log('\n');
27
+ if (result.status === 'completed') {
28
+ const parsed = safeParseResult(result.result);
29
+ console.log(parsed?.output ?? result.result ?? '(no output)');
30
+ }
31
+ else {
32
+ console.error('Query failed.');
33
+ const parsed = safeParseResult(result.result);
34
+ console.error(parsed?.error ?? parsed?.output ?? result.result);
35
+ process.exit(1);
36
+ }
37
+ });
38
+ function safeParseResult(raw) {
39
+ if (!raw)
40
+ return null;
41
+ try {
42
+ return JSON.parse(raw);
43
+ }
44
+ catch {
45
+ return { output: raw };
46
+ }
47
+ }
48
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/cli/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,+BAA+B,CAAC;KAC5C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;KACnC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;KACzC,MAAM,CAAC,SAAS,EAAE,8CAA8C,CAAC;KACjE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,QAAgB,EAAE,IAAyB,EAAE,EAAE;IAC5E,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,IAAK,CAAC;IAE1B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE;QAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAElB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS,eAAe,CAAC,GAAkB;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const serveCommand: Command;
@@ -0,0 +1,14 @@
1
+ import { Command } from 'commander';
2
+ export const serveCommand = new Command('serve')
3
+ .description('Start the memex daemon')
4
+ .action(async () => {
5
+ try {
6
+ const { startDaemon } = await import('../../daemon.js');
7
+ await startDaemon();
8
+ }
9
+ catch (err) {
10
+ console.error(err instanceof Error ? err.message : err);
11
+ process.exit(1);
12
+ }
13
+ });
14
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACxD,MAAM,WAAW,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const statusCommand: Command;