contextmate 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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/src/adapters/base.d.ts +32 -0
  4. package/dist/src/adapters/base.d.ts.map +1 -0
  5. package/dist/src/adapters/base.js +49 -0
  6. package/dist/src/adapters/base.js.map +1 -0
  7. package/dist/src/adapters/claude.d.ts +30 -0
  8. package/dist/src/adapters/claude.d.ts.map +1 -0
  9. package/dist/src/adapters/claude.js +534 -0
  10. package/dist/src/adapters/claude.js.map +1 -0
  11. package/dist/src/adapters/index.d.ts +7 -0
  12. package/dist/src/adapters/index.d.ts.map +1 -0
  13. package/dist/src/adapters/index.js +16 -0
  14. package/dist/src/adapters/index.js.map +1 -0
  15. package/dist/src/adapters/openclaw.d.ts +15 -0
  16. package/dist/src/adapters/openclaw.d.ts.map +1 -0
  17. package/dist/src/adapters/openclaw.js +198 -0
  18. package/dist/src/adapters/openclaw.js.map +1 -0
  19. package/dist/src/bin/contextmate.d.ts +3 -0
  20. package/dist/src/bin/contextmate.d.ts.map +1 -0
  21. package/dist/src/bin/contextmate.js +4 -0
  22. package/dist/src/bin/contextmate.js.map +1 -0
  23. package/dist/src/cli/adapter.d.ts +3 -0
  24. package/dist/src/cli/adapter.d.ts.map +1 -0
  25. package/dist/src/cli/adapter.js +187 -0
  26. package/dist/src/cli/adapter.js.map +1 -0
  27. package/dist/src/cli/daemon.d.ts +3 -0
  28. package/dist/src/cli/daemon.d.ts.map +1 -0
  29. package/dist/src/cli/daemon.js +212 -0
  30. package/dist/src/cli/daemon.js.map +1 -0
  31. package/dist/src/cli/files.d.ts +3 -0
  32. package/dist/src/cli/files.d.ts.map +1 -0
  33. package/dist/src/cli/files.js +158 -0
  34. package/dist/src/cli/files.js.map +1 -0
  35. package/dist/src/cli/index.d.ts +3 -0
  36. package/dist/src/cli/index.d.ts.map +1 -0
  37. package/dist/src/cli/index.js +20 -0
  38. package/dist/src/cli/index.js.map +1 -0
  39. package/dist/src/cli/init.d.ts +3 -0
  40. package/dist/src/cli/init.d.ts.map +1 -0
  41. package/dist/src/cli/init.js +88 -0
  42. package/dist/src/cli/init.js.map +1 -0
  43. package/dist/src/cli/log.d.ts +3 -0
  44. package/dist/src/cli/log.d.ts.map +1 -0
  45. package/dist/src/cli/log.js +141 -0
  46. package/dist/src/cli/log.js.map +1 -0
  47. package/dist/src/cli/mcp.d.ts +3 -0
  48. package/dist/src/cli/mcp.d.ts.map +1 -0
  49. package/dist/src/cli/mcp.js +186 -0
  50. package/dist/src/cli/mcp.js.map +1 -0
  51. package/dist/src/cli/status.d.ts +3 -0
  52. package/dist/src/cli/status.d.ts.map +1 -0
  53. package/dist/src/cli/status.js +107 -0
  54. package/dist/src/cli/status.js.map +1 -0
  55. package/dist/src/config.d.ts +42 -0
  56. package/dist/src/config.d.ts.map +1 -0
  57. package/dist/src/config.js +93 -0
  58. package/dist/src/config.js.map +1 -0
  59. package/dist/src/crypto/auth.d.ts +4 -0
  60. package/dist/src/crypto/auth.d.ts.map +1 -0
  61. package/dist/src/crypto/auth.js +21 -0
  62. package/dist/src/crypto/auth.js.map +1 -0
  63. package/dist/src/crypto/encrypt.d.ts +9 -0
  64. package/dist/src/crypto/encrypt.d.ts.map +1 -0
  65. package/dist/src/crypto/encrypt.js +39 -0
  66. package/dist/src/crypto/encrypt.js.map +1 -0
  67. package/dist/src/crypto/index.d.ts +4 -0
  68. package/dist/src/crypto/index.d.ts.map +1 -0
  69. package/dist/src/crypto/index.js +4 -0
  70. package/dist/src/crypto/index.js.map +1 -0
  71. package/dist/src/crypto/keys.d.ts +9 -0
  72. package/dist/src/crypto/keys.d.ts.map +1 -0
  73. package/dist/src/crypto/keys.js +43 -0
  74. package/dist/src/crypto/keys.js.map +1 -0
  75. package/dist/src/mcp/embeddings.d.ts +16 -0
  76. package/dist/src/mcp/embeddings.d.ts.map +1 -0
  77. package/dist/src/mcp/embeddings.js +237 -0
  78. package/dist/src/mcp/embeddings.js.map +1 -0
  79. package/dist/src/mcp/index.d.ts +10 -0
  80. package/dist/src/mcp/index.d.ts.map +1 -0
  81. package/dist/src/mcp/index.js +6 -0
  82. package/dist/src/mcp/index.js.map +1 -0
  83. package/dist/src/mcp/rerank.d.ts +14 -0
  84. package/dist/src/mcp/rerank.d.ts.map +1 -0
  85. package/dist/src/mcp/rerank.js +47 -0
  86. package/dist/src/mcp/rerank.js.map +1 -0
  87. package/dist/src/mcp/scope.d.ts +26 -0
  88. package/dist/src/mcp/scope.d.ts.map +1 -0
  89. package/dist/src/mcp/scope.js +71 -0
  90. package/dist/src/mcp/scope.js.map +1 -0
  91. package/dist/src/mcp/search.d.ts +18 -0
  92. package/dist/src/mcp/search.d.ts.map +1 -0
  93. package/dist/src/mcp/search.js +110 -0
  94. package/dist/src/mcp/search.js.map +1 -0
  95. package/dist/src/mcp/server.d.ts +15 -0
  96. package/dist/src/mcp/server.d.ts.map +1 -0
  97. package/dist/src/mcp/server.js +340 -0
  98. package/dist/src/mcp/server.js.map +1 -0
  99. package/dist/src/sync/client.d.ts +25 -0
  100. package/dist/src/sync/client.d.ts.map +1 -0
  101. package/dist/src/sync/client.js +109 -0
  102. package/dist/src/sync/client.js.map +1 -0
  103. package/dist/src/sync/engine.d.ts +21 -0
  104. package/dist/src/sync/engine.d.ts.map +1 -0
  105. package/dist/src/sync/engine.js +304 -0
  106. package/dist/src/sync/engine.js.map +1 -0
  107. package/dist/src/sync/index.d.ts +6 -0
  108. package/dist/src/sync/index.d.ts.map +1 -0
  109. package/dist/src/sync/index.js +6 -0
  110. package/dist/src/sync/index.js.map +1 -0
  111. package/dist/src/sync/state.d.ts +33 -0
  112. package/dist/src/sync/state.d.ts.map +1 -0
  113. package/dist/src/sync/state.js +146 -0
  114. package/dist/src/sync/state.js.map +1 -0
  115. package/dist/src/sync/watcher.d.ts +14 -0
  116. package/dist/src/sync/watcher.d.ts.map +1 -0
  117. package/dist/src/sync/watcher.js +74 -0
  118. package/dist/src/sync/watcher.js.map +1 -0
  119. package/dist/src/sync/websocket.d.ts +22 -0
  120. package/dist/src/sync/websocket.d.ts.map +1 -0
  121. package/dist/src/sync/websocket.js +103 -0
  122. package/dist/src/sync/websocket.js.map +1 -0
  123. package/dist/src/types.d.ts +63 -0
  124. package/dist/src/types.d.ts.map +1 -0
  125. package/dist/src/types.js +2 -0
  126. package/dist/src/types.js.map +1 -0
  127. package/dist/src/utils/paths.d.ts +9 -0
  128. package/dist/src/utils/paths.d.ts.map +1 -0
  129. package/dist/src/utils/paths.js +24 -0
  130. package/dist/src/utils/paths.js.map +1 -0
  131. package/package.json +61 -0
@@ -0,0 +1,186 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { randomBytes } from 'node:crypto';
4
+ import { readFile, writeFile, access, mkdir } from 'node:fs/promises';
5
+ import { join, dirname } from 'node:path';
6
+ import { loadConfig, getConfigPath } from '../config.js';
7
+ import { getSearchDbPath } from '../utils/paths.js';
8
+ import { startMcpServer } from '../mcp/index.js';
9
+ async function isInitialized() {
10
+ try {
11
+ await access(getConfigPath());
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ function getApiKeysPath(dataPath) {
19
+ return join(dataPath, 'api-keys.json');
20
+ }
21
+ async function loadApiKeys(dataPath) {
22
+ const keysPath = getApiKeysPath(dataPath);
23
+ try {
24
+ const raw = await readFile(keysPath, 'utf-8');
25
+ return JSON.parse(raw);
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ async function saveApiKeys(dataPath, keys) {
32
+ const keysPath = getApiKeysPath(dataPath);
33
+ await mkdir(dirname(keysPath), { recursive: true });
34
+ await writeFile(keysPath, JSON.stringify(keys, null, 2), 'utf-8');
35
+ }
36
+ const serveCommand = new Command('serve')
37
+ .description('Start local MCP server')
38
+ .option('--api-key <key-id>', 'API key ID to enforce scope/permissions')
39
+ .action(async (opts) => {
40
+ try {
41
+ if (!(await isInitialized())) {
42
+ console.error(chalk.red('ContextMate is not initialized. Run "contextmate init" first.'));
43
+ process.exit(1);
44
+ }
45
+ const config = await loadConfig();
46
+ const searchDbPath = getSearchDbPath(config);
47
+ // Look up API key if provided
48
+ let scopeOptions;
49
+ if (opts.apiKey) {
50
+ const keys = await loadApiKeys(config.data.path);
51
+ const keyInfo = keys.find((k) => k.id === opts.apiKey);
52
+ if (!keyInfo) {
53
+ console.error(chalk.red(`API key with ID "${opts.apiKey}" not found.`));
54
+ process.exit(1);
55
+ }
56
+ scopeOptions = { scope: keyInfo.scope, permission: keyInfo.permissions };
57
+ console.log(chalk.dim(`Enforcing scope: ${keyInfo.scope} (${keyInfo.permissions})`));
58
+ }
59
+ console.log(chalk.dim('Starting MCP server...'));
60
+ // Handle graceful shutdown
61
+ const shutdown = () => {
62
+ console.log(chalk.dim('\nShutting down MCP server...'));
63
+ process.exit(0);
64
+ };
65
+ process.on('SIGINT', shutdown);
66
+ process.on('SIGTERM', shutdown);
67
+ await startMcpServer(config.vault.path, searchDbPath, scopeOptions);
68
+ console.log('MCP server running on stdio');
69
+ }
70
+ catch (err) {
71
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
72
+ process.exit(1);
73
+ }
74
+ });
75
+ const apiKeyCommand = new Command('api-key').description('Manage MCP API keys');
76
+ apiKeyCommand
77
+ .command('create')
78
+ .description('Create a scoped API key')
79
+ .option('--name <name>', 'Name for the API key', 'default')
80
+ .option('--scope <scope>', 'Scope pattern', '*')
81
+ .option('--permissions <permissions>', 'Permissions: read or read-write', 'read')
82
+ .action(async (opts) => {
83
+ try {
84
+ if (!(await isInitialized())) {
85
+ console.error(chalk.red('ContextMate is not initialized. Run "contextmate init" first.'));
86
+ process.exit(1);
87
+ }
88
+ const config = await loadConfig();
89
+ const permissions = opts.permissions;
90
+ if (permissions !== 'read' && permissions !== 'read-write') {
91
+ console.error(chalk.red('Error: permissions must be "read" or "read-write".'));
92
+ process.exit(1);
93
+ }
94
+ const keys = await loadApiKeys(config.data.path);
95
+ const keyValue = `cs_${randomBytes(24).toString('hex')}`;
96
+ const newKey = {
97
+ id: randomBytes(8).toString('hex'),
98
+ name: opts.name,
99
+ scope: opts.scope,
100
+ permissions,
101
+ createdAt: Date.now(),
102
+ lastUsed: null,
103
+ };
104
+ keys.push(newKey);
105
+ await saveApiKeys(config.data.path, keys);
106
+ console.log('');
107
+ console.log(chalk.green('API key created:'));
108
+ console.log(` Name: ${newKey.name}`);
109
+ console.log(` Scope: ${newKey.scope}`);
110
+ console.log(` Permissions: ${newKey.permissions}`);
111
+ console.log('');
112
+ console.log(chalk.bold(` Key: ${keyValue}`));
113
+ console.log('');
114
+ console.log(chalk.yellow(' Warning: This key will only be shown once.'));
115
+ console.log('');
116
+ }
117
+ catch (err) {
118
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
119
+ process.exit(1);
120
+ }
121
+ });
122
+ apiKeyCommand
123
+ .command('list')
124
+ .description('List API keys')
125
+ .action(async () => {
126
+ try {
127
+ if (!(await isInitialized())) {
128
+ console.error(chalk.red('ContextMate is not initialized. Run "contextmate init" first.'));
129
+ process.exit(1);
130
+ }
131
+ const config = await loadConfig();
132
+ const keys = await loadApiKeys(config.data.path);
133
+ if (keys.length === 0) {
134
+ console.log(chalk.dim('No API keys configured.'));
135
+ return;
136
+ }
137
+ console.log('');
138
+ console.log(chalk.bold('API Keys'));
139
+ console.log(chalk.dim('─'.repeat(60)));
140
+ for (const key of keys) {
141
+ const created = new Date(key.createdAt).toISOString().slice(0, 19).replace('T', ' ');
142
+ const lastUsed = key.lastUsed
143
+ ? new Date(key.lastUsed).toISOString().slice(0, 19).replace('T', ' ')
144
+ : 'never';
145
+ console.log(` ${chalk.bold(key.name)} (${key.id})`);
146
+ console.log(` Scope: ${key.scope} Permissions: ${key.permissions}`);
147
+ console.log(` Created: ${created} Last used: ${lastUsed}`);
148
+ console.log('');
149
+ }
150
+ }
151
+ catch (err) {
152
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
153
+ process.exit(1);
154
+ }
155
+ });
156
+ apiKeyCommand
157
+ .command('revoke')
158
+ .description('Revoke an API key')
159
+ .argument('<id>', 'API key ID to revoke')
160
+ .action(async (id) => {
161
+ try {
162
+ if (!(await isInitialized())) {
163
+ console.error(chalk.red('ContextMate is not initialized. Run "contextmate init" first.'));
164
+ process.exit(1);
165
+ }
166
+ const config = await loadConfig();
167
+ const keys = await loadApiKeys(config.data.path);
168
+ const idx = keys.findIndex((k) => k.id === id);
169
+ if (idx === -1) {
170
+ console.error(chalk.red(`API key with ID "${id}" not found.`));
171
+ process.exit(1);
172
+ }
173
+ const removed = keys.splice(idx, 1)[0];
174
+ await saveApiKeys(config.data.path, keys);
175
+ console.log(chalk.green(`API key "${removed.name}" (${removed.id}) revoked.`));
176
+ }
177
+ catch (err) {
178
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
179
+ process.exit(1);
180
+ }
181
+ });
182
+ export const mcpCommand = new Command('mcp')
183
+ .description('Manage MCP server and API keys')
184
+ .addCommand(serveCommand)
185
+ .addCommand(apiKeyCommand);
186
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const statusCommand: Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,eAAO,MAAM,aAAa,SA0FtB,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { access } from 'node:fs/promises';
4
+ import { loadConfig, getConfigDir } from '../config.js';
5
+ import { getSyncDbPath, getPidFilePath } from '../utils/paths.js';
6
+ import { SyncStateDB } from '../sync/index.js';
7
+ async function fileExists(path) {
8
+ try {
9
+ await access(path);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ function isPidRunning(pid) {
17
+ try {
18
+ process.kill(pid, 0);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ export const statusCommand = new Command('status')
26
+ .description('Show ContextMate status')
27
+ .action(async () => {
28
+ try {
29
+ const configDir = getConfigDir();
30
+ // Check if initialized
31
+ if (!(await fileExists(configDir))) {
32
+ console.log(chalk.red('ContextMate is not initialized. Run "contextmate init" first.'));
33
+ process.exit(1);
34
+ }
35
+ const config = await loadConfig();
36
+ console.log('');
37
+ console.log(chalk.bold('ContextMate Status'));
38
+ console.log(chalk.dim('─'.repeat(40)));
39
+ // Vault info
40
+ console.log(` Vault: ${config.vault.path}`);
41
+ console.log(` Data: ${config.data.path}`);
42
+ console.log(` Server: ${config.server.url}`);
43
+ // Sync state summary
44
+ const dbPath = getSyncDbPath(config);
45
+ if (await fileExists(dbPath)) {
46
+ const db = new SyncStateDB(dbPath);
47
+ const allFiles = db.getAllFiles();
48
+ const synced = allFiles.filter((f) => f.syncState === 'synced').length;
49
+ const pending = allFiles.filter((f) => f.syncState === 'pending' || f.syncState === 'modified').length;
50
+ const conflicts = db.getConflicts();
51
+ console.log('');
52
+ console.log(chalk.bold(' Sync State'));
53
+ console.log(` ${chalk.green(`${synced} synced`)} ${chalk.yellow(`${pending} pending`)} ${chalk.red(`${conflicts.length} conflicts`)}`);
54
+ if (conflicts.length > 0) {
55
+ console.log('');
56
+ console.log(chalk.red(' Conflicts:'));
57
+ for (const conflict of conflicts) {
58
+ console.log(` - ${conflict.path}`);
59
+ }
60
+ }
61
+ db.close();
62
+ }
63
+ else {
64
+ console.log('');
65
+ console.log(chalk.dim(' Sync state: No sync database found'));
66
+ }
67
+ // Adapter status
68
+ console.log('');
69
+ console.log(chalk.bold(' Adapters'));
70
+ const openclawStatus = config.adapters.openclaw.enabled
71
+ ? chalk.green('enabled')
72
+ : chalk.dim('disabled');
73
+ console.log(` OpenClaw: ${openclawStatus} (${config.adapters.openclaw.workspacePath})`);
74
+ const claudeStatus = config.adapters.claude.enabled
75
+ ? chalk.green('enabled')
76
+ : chalk.dim('disabled');
77
+ console.log(` Claude Code: ${claudeStatus} (${config.adapters.claude.skillsPath})`);
78
+ // Daemon status
79
+ console.log('');
80
+ console.log(chalk.bold(' Daemon'));
81
+ const pidFile = getPidFilePath(config);
82
+ if (await fileExists(pidFile)) {
83
+ const { readFile } = await import('node:fs/promises');
84
+ const pidStr = await readFile(pidFile, 'utf-8');
85
+ const pid = parseInt(pidStr.trim(), 10);
86
+ if (isPidRunning(pid)) {
87
+ console.log(` Status: ${chalk.green('running')} (PID: ${pid})`);
88
+ }
89
+ else {
90
+ console.log(` Status: ${chalk.red('stale PID file')} (PID: ${pid} not running)`);
91
+ }
92
+ }
93
+ else {
94
+ console.log(` Status: ${chalk.dim('stopped')}`);
95
+ }
96
+ // MCP server config
97
+ console.log('');
98
+ console.log(chalk.bold(' MCP Server'));
99
+ console.log(` Port: ${config.mcp.port} Host: ${config.mcp.host}`);
100
+ console.log('');
101
+ }
102
+ catch (err) {
103
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
104
+ process.exit(1);
105
+ }
106
+ });
107
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface ContextMateConfig {
2
+ server: {
3
+ url: string;
4
+ apiKey?: string;
5
+ };
6
+ vault: {
7
+ path: string;
8
+ };
9
+ data: {
10
+ path: string;
11
+ };
12
+ sync: {
13
+ pollIntervalMs: number;
14
+ debounceMs: number;
15
+ maxRetries: number;
16
+ };
17
+ adapters: {
18
+ openclaw: {
19
+ enabled: boolean;
20
+ workspacePath: string;
21
+ };
22
+ claude: {
23
+ enabled: boolean;
24
+ skillsPath: string;
25
+ claudeDir: string;
26
+ syncRules: boolean;
27
+ syncProjectMemories: boolean;
28
+ syncGlobalMemory: boolean;
29
+ };
30
+ };
31
+ mcp: {
32
+ port: number;
33
+ host: string;
34
+ };
35
+ }
36
+ export declare function getConfigDir(): string;
37
+ export declare function getConfigPath(): string;
38
+ export declare function getDefaultConfig(): ContextMateConfig;
39
+ export declare function loadConfig(): Promise<ContextMateConfig>;
40
+ export declare function saveConfig(config: ContextMateConfig): Promise<void>;
41
+ export declare function ensureDirectories(config: ContextMateConfig): Promise<void>;
42
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACJ,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,OAAO,EAAE,OAAO,CAAC;YACjB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,MAAM,EAAE;YACN,OAAO,EAAE,OAAO,CAAC;YACjB,UAAU,EAAE,MAAM,CAAC;YACnB,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,OAAO,CAAC;YACnB,mBAAmB,EAAE,OAAO,CAAC;YAC7B,gBAAgB,EAAE,OAAO,CAAC;SAC3B,CAAC;KACH,CAAC;IACF,GAAG,EAAE;QACH,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,gBAAgB,IAAI,iBAAiB,CAoCpD;AA0BD,wBAAsB,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAa7D;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF"}
@@ -0,0 +1,93 @@
1
+ import { parse, stringify } from 'smol-toml';
2
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ export function getConfigDir() {
6
+ return join(homedir(), '.contextmate');
7
+ }
8
+ export function getConfigPath() {
9
+ return join(getConfigDir(), 'config.toml');
10
+ }
11
+ export function getDefaultConfig() {
12
+ const configDir = getConfigDir();
13
+ return {
14
+ server: {
15
+ url: 'https://api.contextmate.dev',
16
+ },
17
+ vault: {
18
+ path: join(configDir, 'vault'),
19
+ },
20
+ data: {
21
+ path: join(configDir, 'data'),
22
+ },
23
+ sync: {
24
+ pollIntervalMs: 60000,
25
+ debounceMs: 500,
26
+ maxRetries: 3,
27
+ },
28
+ adapters: {
29
+ openclaw: {
30
+ enabled: false,
31
+ workspacePath: join(homedir(), '.openclaw', 'workspace'),
32
+ },
33
+ claude: {
34
+ enabled: false,
35
+ skillsPath: join(homedir(), '.agents', 'skills'),
36
+ claudeDir: join(homedir(), '.claude'),
37
+ syncRules: true,
38
+ syncProjectMemories: true,
39
+ syncGlobalMemory: true,
40
+ },
41
+ },
42
+ mcp: {
43
+ port: 3100,
44
+ host: 'localhost',
45
+ },
46
+ };
47
+ }
48
+ function deepMerge(defaults, overrides) {
49
+ const result = { ...defaults };
50
+ for (const key of Object.keys(overrides)) {
51
+ const defaultVal = result[key];
52
+ const overrideVal = overrides[key];
53
+ if (defaultVal !== null &&
54
+ overrideVal !== null &&
55
+ typeof defaultVal === 'object' &&
56
+ typeof overrideVal === 'object' &&
57
+ !Array.isArray(defaultVal) &&
58
+ !ArrayBuffer.isView(defaultVal)) {
59
+ result[key] = deepMerge(defaultVal, overrideVal);
60
+ }
61
+ else if (overrideVal !== undefined) {
62
+ result[key] = overrideVal;
63
+ }
64
+ }
65
+ return result;
66
+ }
67
+ export async function loadConfig() {
68
+ const defaults = getDefaultConfig();
69
+ const configPath = getConfigPath();
70
+ let raw;
71
+ try {
72
+ raw = await readFile(configPath, 'utf-8');
73
+ }
74
+ catch {
75
+ return defaults;
76
+ }
77
+ const parsed = parse(raw);
78
+ return deepMerge(defaults, parsed);
79
+ }
80
+ export async function saveConfig(config) {
81
+ const configDir = getConfigDir();
82
+ await mkdir(configDir, { recursive: true });
83
+ const toml = stringify(config);
84
+ await writeFile(getConfigPath(), toml, 'utf-8');
85
+ }
86
+ export async function ensureDirectories(config) {
87
+ await Promise.all([
88
+ mkdir(config.vault.path, { recursive: true }),
89
+ mkdir(config.data.path, { recursive: true }),
90
+ mkdir(join(getConfigDir(), 'backups'), { recursive: true }),
91
+ ]);
92
+ }
93
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function createAuthHash(authKey: Uint8Array): string;
2
+ export declare function verifyAuthKey(authKey: Uint8Array, storedHash: string): boolean;
3
+ export declare function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean;
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/crypto/auth.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAE1D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAI9E;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CASrE"}
@@ -0,0 +1,21 @@
1
+ import { blake3 } from '@noble/hashes/blake3';
2
+ import { bytesToHex, hexToBytes } from '@noble/hashes/utils';
3
+ export function createAuthHash(authKey) {
4
+ return bytesToHex(blake3(authKey));
5
+ }
6
+ export function verifyAuthKey(authKey, storedHash) {
7
+ const computed = blake3(authKey);
8
+ const stored = hexToBytes(storedHash);
9
+ return timingSafeEqual(computed, stored);
10
+ }
11
+ export function timingSafeEqual(a, b) {
12
+ if (a.length !== b.length) {
13
+ return false;
14
+ }
15
+ let diff = 0;
16
+ for (let i = 0; i < a.length; i++) {
17
+ diff |= a[i] ^ b[i];
18
+ }
19
+ return diff === 0;
20
+ }
21
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/crypto/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,UAAU,cAAc,CAAC,OAAmB;IAChD,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAmB,EAAE,UAAkB;IACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,OAAO,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAa,EAAE,CAAa;IAC1D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const ENCRYPTION_VERSION = 1;
2
+ export declare const NONCE_LENGTH = 12;
3
+ export declare const VERSION_LENGTH = 4;
4
+ export declare function encryptFile(plaintext: Uint8Array, key: Uint8Array): Uint8Array;
5
+ export declare function decryptFile(encrypted: Uint8Array, key: Uint8Array): Uint8Array;
6
+ export declare function hashContent(content: Uint8Array): string;
7
+ export declare function encryptString(plaintext: string, key: Uint8Array): Uint8Array;
8
+ export declare function decryptString(encrypted: Uint8Array, key: Uint8Array): string;
9
+ //# sourceMappingURL=encrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../../src/crypto/encrypt.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,wBAAgB,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAY9E;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAa9E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAEvD;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAE5E;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,CAE5E"}
@@ -0,0 +1,39 @@
1
+ import { gcm } from '@noble/ciphers/aes';
2
+ import { randomBytes } from '@noble/ciphers/webcrypto';
3
+ import { blake3 } from '@noble/hashes/blake3';
4
+ import { bytesToHex } from '@noble/hashes/utils';
5
+ export const ENCRYPTION_VERSION = 1;
6
+ export const NONCE_LENGTH = 12;
7
+ export const VERSION_LENGTH = 4;
8
+ export function encryptFile(plaintext, key) {
9
+ const nonce = randomBytes(NONCE_LENGTH);
10
+ const cipher = gcm(key, nonce);
11
+ const ciphertext = cipher.encrypt(plaintext);
12
+ const result = new Uint8Array(VERSION_LENGTH + NONCE_LENGTH + ciphertext.length);
13
+ const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
14
+ view.setUint32(0, ENCRYPTION_VERSION, true);
15
+ result.set(nonce, VERSION_LENGTH);
16
+ result.set(ciphertext, VERSION_LENGTH + NONCE_LENGTH);
17
+ return result;
18
+ }
19
+ export function decryptFile(encrypted, key) {
20
+ const view = new DataView(encrypted.buffer, encrypted.byteOffset, encrypted.byteLength);
21
+ const version = view.getUint32(0, true);
22
+ if (version !== ENCRYPTION_VERSION) {
23
+ throw new Error(`Unsupported encryption version: ${version}`);
24
+ }
25
+ const nonce = encrypted.slice(VERSION_LENGTH, VERSION_LENGTH + NONCE_LENGTH);
26
+ const ciphertext = encrypted.slice(VERSION_LENGTH + NONCE_LENGTH);
27
+ const cipher = gcm(key, nonce);
28
+ return cipher.decrypt(ciphertext);
29
+ }
30
+ export function hashContent(content) {
31
+ return bytesToHex(blake3(content));
32
+ }
33
+ export function encryptString(plaintext, key) {
34
+ return encryptFile(new TextEncoder().encode(plaintext), key);
35
+ }
36
+ export function decryptString(encrypted, key) {
37
+ return new TextDecoder().decode(decryptFile(encrypted, key));
38
+ }
39
+ //# sourceMappingURL=encrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../../src/crypto/encrypt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,SAAqB,EAAE,GAAe;IAChE,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,cAAc,GAAG,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/E,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;IAEtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAqB,EAAE,GAAe;IAChE,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAExC,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAmB;IAC7C,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,GAAe;IAC9D,OAAO,WAAW,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAqB,EAAE,GAAe;IAClE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { generateSalt, deriveMasterKey, deriveVaultKey, deriveFolderKey, deriveFileKey, deriveAuthKey, deriveSharingKey, deriveKeyForPath, } from './keys.js';
2
+ export { ENCRYPTION_VERSION, NONCE_LENGTH, VERSION_LENGTH, encryptFile, decryptFile, hashContent, encryptString, decryptString, } from './encrypt.js';
3
+ export { createAuthHash, verifyAuthKey, timingSafeEqual, } from './auth.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,GAChB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { generateSalt, deriveMasterKey, deriveVaultKey, deriveFolderKey, deriveFileKey, deriveAuthKey, deriveSharingKey, deriveKeyForPath, } from './keys.js';
2
+ export { ENCRYPTION_VERSION, NONCE_LENGTH, VERSION_LENGTH, encryptFile, decryptFile, hashContent, encryptString, decryptString, } from './encrypt.js';
3
+ export { createAuthHash, verifyAuthKey, timingSafeEqual, } from './auth.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,GAChB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function generateSalt(): Uint8Array;
2
+ export declare function deriveMasterKey(passphrase: string, salt: Uint8Array): Promise<Uint8Array>;
3
+ export declare function deriveVaultKey(masterKey: Uint8Array): Uint8Array;
4
+ export declare function deriveFolderKey(vaultKey: Uint8Array, folderId: string): Uint8Array;
5
+ export declare function deriveFileKey(folderKey: Uint8Array, fileId: string): Uint8Array;
6
+ export declare function deriveAuthKey(masterKey: Uint8Array): Uint8Array;
7
+ export declare function deriveSharingKey(masterKey: Uint8Array): Uint8Array;
8
+ export declare function deriveKeyForPath(vaultKey: Uint8Array, filePath: string): Uint8Array;
9
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/crypto/keys.ts"],"names":[],"mappings":"AAOA,wBAAgB,YAAY,IAAI,UAAU,CAEzC;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAWrB;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAEhE;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,MAAM,GACf,UAAU,CAEZ;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,MAAM,GACb,UAAU,CAEZ;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAElE;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,MAAM,GACf,UAAU,CAMZ"}