@dmsdc-ai/aigentry-brain 0.0.1

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 (136) hide show
  1. package/bin/aigentry-brain-mcp.mjs +17 -0
  2. package/bin/aigentry-brain-setup.mjs +17 -0
  3. package/bin/aigentry-brain.mjs +17 -0
  4. package/dist/audit/AuditTrail.d.ts +15 -0
  5. package/dist/audit/AuditTrail.js +43 -0
  6. package/dist/audit/AuditTrail.js.map +1 -0
  7. package/dist/backend/GitBackend.d.ts +27 -0
  8. package/dist/backend/GitBackend.js +201 -0
  9. package/dist/backend/GitBackend.js.map +1 -0
  10. package/dist/backend/SyncBackend.d.ts +13 -0
  11. package/dist/backend/SyncBackend.js +2 -0
  12. package/dist/backend/SyncBackend.js.map +1 -0
  13. package/dist/cli/AutoUpdater.d.ts +7 -0
  14. package/dist/cli/AutoUpdater.js +275 -0
  15. package/dist/cli/AutoUpdater.js.map +1 -0
  16. package/dist/cli/ConfigStore.d.ts +17 -0
  17. package/dist/cli/ConfigStore.js +50 -0
  18. package/dist/cli/ConfigStore.js.map +1 -0
  19. package/dist/cli/GhIntegration.d.ts +55 -0
  20. package/dist/cli/GhIntegration.js +192 -0
  21. package/dist/cli/GhIntegration.js.map +1 -0
  22. package/dist/cli/Prerequisites.d.ts +48 -0
  23. package/dist/cli/Prerequisites.js +182 -0
  24. package/dist/cli/Prerequisites.js.map +1 -0
  25. package/dist/cli/SetupWizard.d.ts +26 -0
  26. package/dist/cli/SetupWizard.js +407 -0
  27. package/dist/cli/SetupWizard.js.map +1 -0
  28. package/dist/cli/braincli.d.ts +2 -0
  29. package/dist/cli/braincli.js +260 -0
  30. package/dist/cli/braincli.js.map +1 -0
  31. package/dist/cli/setup.d.ts +25 -0
  32. package/dist/cli/setup.js +238 -0
  33. package/dist/cli/setup.js.map +1 -0
  34. package/dist/context/ConfidenceGuard.d.ts +11 -0
  35. package/dist/context/ConfidenceGuard.js +32 -0
  36. package/dist/context/ConfidenceGuard.js.map +1 -0
  37. package/dist/context/ContextBudgetPolicy.d.ts +21 -0
  38. package/dist/context/ContextBudgetPolicy.js +136 -0
  39. package/dist/context/ContextBudgetPolicy.js.map +1 -0
  40. package/dist/context/ContextPacker.d.ts +30 -0
  41. package/dist/context/ContextPacker.js +219 -0
  42. package/dist/context/ContextPacker.js.map +1 -0
  43. package/dist/context/ContextRestoreService.d.ts +39 -0
  44. package/dist/context/ContextRestoreService.js +134 -0
  45. package/dist/context/ContextRestoreService.js.map +1 -0
  46. package/dist/contract/BrainContract.d.ts +93 -0
  47. package/dist/contract/BrainContract.js +245 -0
  48. package/dist/contract/BrainContract.js.map +1 -0
  49. package/dist/core/ContentDedup.d.ts +43 -0
  50. package/dist/core/ContentDedup.js +145 -0
  51. package/dist/core/ContentDedup.js.map +1 -0
  52. package/dist/core/EntityGraph.d.ts +66 -0
  53. package/dist/core/EntityGraph.js +196 -0
  54. package/dist/core/EntityGraph.js.map +1 -0
  55. package/dist/core/EntrySchema.d.ts +46 -0
  56. package/dist/core/EntrySchema.js +4 -0
  57. package/dist/core/EntrySchema.js.map +1 -0
  58. package/dist/core/GraphStore.d.ts +16 -0
  59. package/dist/core/GraphStore.js +29 -0
  60. package/dist/core/GraphStore.js.map +1 -0
  61. package/dist/core/MemoryDecay.d.ts +49 -0
  62. package/dist/core/MemoryDecay.js +113 -0
  63. package/dist/core/MemoryDecay.js.map +1 -0
  64. package/dist/core/ProfileFormat.d.ts +38 -0
  65. package/dist/core/ProfileFormat.js +254 -0
  66. package/dist/core/ProfileFormat.js.map +1 -0
  67. package/dist/core/ProfileManager.d.ts +80 -0
  68. package/dist/core/ProfileManager.js +269 -0
  69. package/dist/core/ProfileManager.js.map +1 -0
  70. package/dist/core/SchemaMigration.d.ts +12 -0
  71. package/dist/core/SchemaMigration.js +34 -0
  72. package/dist/core/SchemaMigration.js.map +1 -0
  73. package/dist/crypto/AgeCrypto.d.ts +26 -0
  74. package/dist/crypto/AgeCrypto.js +101 -0
  75. package/dist/crypto/AgeCrypto.js.map +1 -0
  76. package/dist/index.d.ts +38 -0
  77. package/dist/index.js +30 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/mcp/BrainMcpServer.d.ts +13 -0
  80. package/dist/mcp/BrainMcpServer.js +223 -0
  81. package/dist/mcp/BrainMcpServer.js.map +1 -0
  82. package/dist/mcp/cli.d.ts +2 -0
  83. package/dist/mcp/cli.js +107 -0
  84. package/dist/mcp/cli.js.map +1 -0
  85. package/dist/metrics/ResumeMetrics.d.ts +20 -0
  86. package/dist/metrics/ResumeMetrics.js +46 -0
  87. package/dist/metrics/ResumeMetrics.js.map +1 -0
  88. package/dist/peers/PeerStore.d.ts +17 -0
  89. package/dist/peers/PeerStore.js +65 -0
  90. package/dist/peers/PeerStore.js.map +1 -0
  91. package/dist/policy/PolicyEngine.d.ts +16 -0
  92. package/dist/policy/PolicyEngine.js +70 -0
  93. package/dist/policy/PolicyEngine.js.map +1 -0
  94. package/dist/policy/PolicyEnvelope.d.ts +7 -0
  95. package/dist/policy/PolicyEnvelope.js +2 -0
  96. package/dist/policy/PolicyEnvelope.js.map +1 -0
  97. package/dist/policy/RetentionParser.d.ts +6 -0
  98. package/dist/policy/RetentionParser.js +48 -0
  99. package/dist/policy/RetentionParser.js.map +1 -0
  100. package/dist/shared/AtomicWrite.d.ts +1 -0
  101. package/dist/shared/AtomicWrite.js +11 -0
  102. package/dist/shared/AtomicWrite.js.map +1 -0
  103. package/dist/shared/Clock.d.ts +11 -0
  104. package/dist/shared/Clock.js +17 -0
  105. package/dist/shared/Clock.js.map +1 -0
  106. package/dist/shared/Config.d.ts +15 -0
  107. package/dist/shared/Config.js +67 -0
  108. package/dist/shared/Config.js.map +1 -0
  109. package/dist/shared/Encryption.d.ts +19 -0
  110. package/dist/shared/Encryption.js +47 -0
  111. package/dist/shared/Encryption.js.map +1 -0
  112. package/dist/shared/Logger.d.ts +12 -0
  113. package/dist/shared/Logger.js +40 -0
  114. package/dist/shared/Logger.js.map +1 -0
  115. package/dist/shared/Mutex.d.ts +7 -0
  116. package/dist/shared/Mutex.js +34 -0
  117. package/dist/shared/Mutex.js.map +1 -0
  118. package/dist/shared/SetupErrors.d.ts +31 -0
  119. package/dist/shared/SetupErrors.js +155 -0
  120. package/dist/shared/SetupErrors.js.map +1 -0
  121. package/dist/status/SyncStatusStore.d.ts +17 -0
  122. package/dist/status/SyncStatusStore.js +48 -0
  123. package/dist/status/SyncStatusStore.js.map +1 -0
  124. package/dist/sync/AutoCommitter.d.ts +17 -0
  125. package/dist/sync/AutoCommitter.js +68 -0
  126. package/dist/sync/AutoCommitter.js.map +1 -0
  127. package/dist/sync/ConflictResolver.d.ts +7 -0
  128. package/dist/sync/ConflictResolver.js +56 -0
  129. package/dist/sync/ConflictResolver.js.map +1 -0
  130. package/dist/sync/PushPullManager.d.ts +23 -0
  131. package/dist/sync/PushPullManager.js +155 -0
  132. package/dist/sync/PushPullManager.js.map +1 -0
  133. package/dist/sync/SyncEngine.d.ts +43 -0
  134. package/dist/sync/SyncEngine.js +145 -0
  135. package/dist/sync/SyncEngine.js.map +1 -0
  136. package/package.json +65 -0
@@ -0,0 +1,260 @@
1
+ #!/usr/bin/env node
2
+ import { join } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import yaml from 'js-yaml';
6
+ import simpleGit from 'simple-git';
7
+ import { ProfileManager } from '../core/ProfileManager.js';
8
+ import { SyncStatusStore } from '../status/SyncStatusStore.js';
9
+ import { SystemClock } from '../shared/Clock.js';
10
+ import { BrainContract } from '../contract/BrainContract.js';
11
+ import { loadConfig } from '../shared/Config.js';
12
+ import { createLogger } from '../shared/Logger.js';
13
+ import { runSetup, runUninstall, defaultSetupOptions } from './setup.js';
14
+ import { checkAndUpdate } from './AutoUpdater.js';
15
+ // Check for updates on CLI usage (blocking for setup command)
16
+ checkAndUpdate({ blocking: process.argv[2] === 'setup' });
17
+ // Auto-clone repo if sync is configured but repo doesn't exist yet
18
+ let preConfig = loadConfig();
19
+ if (preConfig.remoteUrl && preConfig.repoPath && !existsSync(join(preConfig.repoPath, '.git'))) {
20
+ try {
21
+ const git = simpleGit();
22
+ await git.clone(preConfig.remoteUrl, preConfig.repoPath);
23
+ // Reload config so profilePath points to repo
24
+ preConfig = loadConfig();
25
+ }
26
+ catch {
27
+ // Clone failed (offline, etc.) — continue with local profile
28
+ }
29
+ }
30
+ const config = preConfig;
31
+ const logger = createLogger('braincli', { level: config.logLevel });
32
+ const pm = new ProfileManager(config.profilePath, SystemClock, config.deviceId);
33
+ const statusStore = new SyncStatusStore(config.statusPath);
34
+ const contract = new BrainContract({ profileManager: pm, statusStore });
35
+ const [, , command, ...args] = process.argv;
36
+ function usage() {
37
+ console.log(`aigentry-brain CLI — Memory Profile Manager
38
+
39
+ Usage: aigentry-brain <command> [options]
40
+
41
+ Commands:
42
+ list [--category <cat>] [--tags <t1,t2>] [--search <query>]
43
+ List memory entries with optional filters
44
+
45
+ get <id>
46
+ Get a specific entry by id
47
+
48
+ health
49
+ Show system health report
50
+
51
+ export [--format json|yaml]
52
+ Export all entries
53
+
54
+ stats
55
+ Show profile statistics
56
+
57
+ status
58
+ Show setup status dashboard (GitHub, encryption, sync, devices)
59
+
60
+ version
61
+ Show version info
62
+
63
+ setup
64
+ Register aigentry-brain MCP server in ~/.claude/.mcp.json and
65
+ create ~/.aigentry/ profile directory (idempotent)
66
+
67
+ uninstall
68
+ Remove aigentry-brain MCP server entry from ~/.claude/.mcp.json
69
+ `);
70
+ }
71
+ async function run() {
72
+ switch (command) {
73
+ case 'list': {
74
+ const filter = {};
75
+ for (let i = 0; i < args.length; i++) {
76
+ if (args[i] === '--category' && args[i + 1])
77
+ filter['category'] = args[++i];
78
+ if (args[i] === '--tags' && args[i + 1])
79
+ filter['tags'] = args[++i].split(',');
80
+ if (args[i] === '--search' && args[i + 1])
81
+ filter['contentQuery'] = args[++i];
82
+ if (args[i] === '--source' && args[i + 1])
83
+ filter['source'] = args[++i];
84
+ }
85
+ const entries = await contract.query(Object.keys(filter).length > 0 ? filter : undefined);
86
+ if (entries.length === 0) {
87
+ console.log('No entries found.');
88
+ return;
89
+ }
90
+ for (const e of entries) {
91
+ const tags = e.tags && e.tags.length > 0 ? ` [${e.tags.join(', ')}]` : '';
92
+ console.log(`${e.id} ${e.category.padEnd(12)} ${e.content.slice(0, 60)}${tags}`);
93
+ }
94
+ console.log(`\n${entries.length} entries total.`);
95
+ break;
96
+ }
97
+ case 'get': {
98
+ const id = args[0];
99
+ if (!id) {
100
+ console.error('Usage: aigentry-brain get <id>');
101
+ process.exit(1);
102
+ }
103
+ const entries = await contract.query();
104
+ const entry = entries.find(e => e.id === id);
105
+ if (!entry) {
106
+ console.error(`Entry not found: ${id}`);
107
+ process.exit(1);
108
+ }
109
+ console.log(JSON.stringify(entry, null, 2));
110
+ break;
111
+ }
112
+ case 'health': {
113
+ const health = await contract.health();
114
+ console.log(`Profile accessible: ${health.profileAccessible ? 'yes' : 'NO'}`);
115
+ console.log(`Entry count: ${health.entryCount}`);
116
+ console.log(`Sync status: ${health.syncStatus}`);
117
+ console.log(`Uptime: ${(health.uptimeMs / 1000).toFixed(1)}s`);
118
+ break;
119
+ }
120
+ case 'export': {
121
+ const format = args.includes('--format') ? args[args.indexOf('--format') + 1] : 'json';
122
+ const entries = await contract.query();
123
+ if (format === 'json') {
124
+ console.log(JSON.stringify(entries, null, 2));
125
+ }
126
+ else if (format === 'yaml') {
127
+ console.log(yaml.dump(entries, { indent: 2 }));
128
+ }
129
+ else {
130
+ console.error(`Unsupported format: ${format}. Supported: json, yaml`);
131
+ process.exit(1);
132
+ }
133
+ break;
134
+ }
135
+ case 'stats': {
136
+ const entries = await contract.query();
137
+ const categories = new Map();
138
+ for (const e of entries) {
139
+ categories.set(e.category, (categories.get(e.category) ?? 0) + 1);
140
+ }
141
+ console.log(`Total entries: ${entries.length}`);
142
+ console.log(`Categories:`);
143
+ for (const [cat, count] of [...categories.entries()].sort((a, b) => b[1] - a[1])) {
144
+ console.log(` ${cat.padEnd(16)} ${count}`);
145
+ }
146
+ const status = await contract.syncStatus();
147
+ console.log(`Sync status: ${status.status}`);
148
+ break;
149
+ }
150
+ case 'status': {
151
+ const { checkGhAuth } = await import('./Prerequisites.js');
152
+ const { readConfig } = await import('./ConfigStore.js');
153
+ const { execFileSync } = await import('node:child_process');
154
+ const { readFileSync, existsSync: fsExistsSync } = await import('node:fs');
155
+ console.log(`aigentry-brain v${config.serverVersion}`);
156
+ console.log('');
157
+ // GitHub auth
158
+ const ghAuth = await checkGhAuth();
159
+ if (ghAuth.authenticated) {
160
+ console.log(`✅ GitHub: authenticated (${ghAuth.username ?? 'unknown'})`);
161
+ }
162
+ else {
163
+ console.log('❌ GitHub: not authenticated. Run: gh auth login --web');
164
+ }
165
+ // Profile repo
166
+ const brainConfig = await readConfig(join(homedir(), '.aigentry', 'config.json'));
167
+ if (brainConfig?.remoteUrl) {
168
+ console.log(`✅ Profile: ${brainConfig.setupComplete ? 'synced' : 'configured'} (${brainConfig.remoteUrl})`);
169
+ }
170
+ else {
171
+ console.log('⚠️ Profile: offline mode (no remote configured)');
172
+ }
173
+ // Encryption (age-encryption npm — no external binaries needed)
174
+ const { readKeyFile, AgeKeyError } = await import('../crypto/AgeCrypto.js');
175
+ try {
176
+ const keyPair = readKeyFile();
177
+ const pk = keyPair.recipient;
178
+ console.log(`✅ Encryption: active (age-encryption npm)`);
179
+ console.log(`✅ Age key: ${pk.slice(0, 10)}...${pk.slice(-5)}`);
180
+ }
181
+ catch (err) {
182
+ if (err instanceof AgeKeyError) {
183
+ console.log('❌ Encryption: age key not found. Run: aigentry-brain setup');
184
+ }
185
+ else {
186
+ console.log('⚠️ Encryption: error reading key file');
187
+ }
188
+ }
189
+ // Multi-machine (count recipients in memory-profile.enc.json)
190
+ const repoPath = brainConfig?.remoteUrl
191
+ ? join(homedir(), '.aigentry', 'repo')
192
+ : null;
193
+ const encJsonPath = repoPath ? join(repoPath, 'memory-profile.enc.json') : null;
194
+ if (encJsonPath && fsExistsSync(encJsonPath)) {
195
+ try {
196
+ const encContent = JSON.parse(readFileSync(encJsonPath, 'utf-8'));
197
+ const recipients = encContent._aigentry?.recipients ?? [];
198
+ const deviceCount = recipients.length;
199
+ if (deviceCount > 1) {
200
+ console.log(`✅ Multi-machine: ${deviceCount} devices registered`);
201
+ }
202
+ else {
203
+ console.log(`⚠️ Multi-machine: ${deviceCount} device registered`);
204
+ }
205
+ if (encContent._aigentry?.format === 'plaintext-fallback') {
206
+ console.log('⚠️ Encryption mode: plaintext fallback (re-run setup to enable encryption)');
207
+ }
208
+ }
209
+ catch {
210
+ console.log('⚠️ Multi-machine: could not read profile');
211
+ }
212
+ }
213
+ else {
214
+ // Check legacy .sops.yaml
215
+ const sopsYamlPath = repoPath ? join(repoPath, '.sops.yaml') : null;
216
+ if (sopsYamlPath && fsExistsSync(sopsYamlPath)) {
217
+ console.log('⚠️ Multi-machine: legacy .sops.yaml found — will migrate on next sync');
218
+ }
219
+ else {
220
+ console.log('⚠️ Multi-machine: no profile synced yet');
221
+ }
222
+ }
223
+ break;
224
+ }
225
+ case 'version': {
226
+ console.log(`aigentry-brain ${config.serverVersion}`);
227
+ break;
228
+ }
229
+ case 'setup': {
230
+ const setupOpts = defaultSetupOptions();
231
+ await runSetup(setupOpts);
232
+ // Run the full 6-step wizard (prereqs, repo, config, mcp env, sync, health)
233
+ const { runSetupWizard } = await import('./SetupWizard.js');
234
+ const result = await runSetupWizard({
235
+ mcpConfigPath: setupOpts.mcpConfigPath,
236
+ mcpCliPath: setupOpts.mcpCliPath,
237
+ profileDir: setupOpts.profileDir,
238
+ });
239
+ if (!result.success) {
240
+ console.log('[aigentry-brain] Run "aigentry-brain-setup" to complete setup.');
241
+ }
242
+ break;
243
+ }
244
+ case 'uninstall': {
245
+ await runUninstall(defaultSetupOptions());
246
+ break;
247
+ }
248
+ default:
249
+ usage();
250
+ if (command && command !== 'help' && command !== '--help') {
251
+ process.exit(1);
252
+ }
253
+ break;
254
+ }
255
+ }
256
+ run().catch((err) => {
257
+ logger.error('CLI error', { error: String(err) });
258
+ process.exit(1);
259
+ });
260
+ //# sourceMappingURL=braincli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"braincli.js","sourceRoot":"","sources":["../../src/cli/braincli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ export interface SetupOptions {
3
+ profileDir: string;
4
+ mcpConfigPath: string;
5
+ mcpCliPath: string;
6
+ geminiConfigPath: string;
7
+ codexConfigPath: string;
8
+ }
9
+ export declare function defaultSetupOptions(): SetupOptions;
10
+ /**
11
+ * Register aigentry-brain in Gemini's settings.json (same mcpServers JSON structure as Claude).
12
+ * Fails gracefully — if the file/dir doesn't exist and Gemini isn't installed, just skip.
13
+ */
14
+ export declare function registerGemini(geminiConfigPath: string, mcpCliPath: string, env?: Record<string, string>): Promise<void>;
15
+ /**
16
+ * Register aigentry-brain in Codex's config.toml.
17
+ * Uses a simple string-based approach (no TOML library dependency):
18
+ * 1. Read existing content
19
+ * 2. Remove existing [mcp_servers.aigentry-brain] section (and its env sub-table)
20
+ * 3. Append the new section
21
+ * Fails gracefully if Codex isn't installed.
22
+ */
23
+ export declare function registerCodex(codexConfigPath: string, mcpCliPath: string, env?: Record<string, string>): Promise<void>;
24
+ export declare function runSetup(options: SetupOptions): Promise<void>;
25
+ export declare function runUninstall(options: SetupOptions): Promise<void>;
@@ -0,0 +1,238 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, readFile, writeFile, access } from 'node:fs/promises';
3
+ import { openSync, writeSync, closeSync } from 'node:fs';
4
+ import { dirname, join } from 'node:path';
5
+ import { homedir } from 'node:os';
6
+ import { fileURLToPath } from 'node:url';
7
+ /** Write directly to terminal, bypassing npm's output suppression */
8
+ function log(msg) {
9
+ const data = msg + '\n';
10
+ for (const ttyPath of ['/dev/tty', 'CON']) {
11
+ try {
12
+ const fd = openSync(ttyPath, 'w');
13
+ writeSync(fd, data);
14
+ closeSync(fd);
15
+ return;
16
+ }
17
+ catch { /* try next */ }
18
+ }
19
+ process.stderr.write(data);
20
+ }
21
+ const __filename = fileURLToPath(import.meta.url);
22
+ const __dirname = dirname(__filename);
23
+ /**
24
+ * Resolve the project root directory.
25
+ * Works whether running from dist/cli/setup.js or src/cli/setup.ts (via tsx).
26
+ */
27
+ function resolveProjectRoot() {
28
+ // __dirname is dist/cli/ or src/cli/ — go up 2 levels to project root
29
+ return join(__dirname, '..', '..');
30
+ }
31
+ export function defaultSetupOptions() {
32
+ const projectRoot = resolveProjectRoot();
33
+ return {
34
+ profileDir: join(homedir(), '.aigentry'),
35
+ mcpConfigPath: join(homedir(), '.claude', '.mcp.json'),
36
+ mcpCliPath: join(projectRoot, 'bin', 'aigentry-brain-mcp.mjs'),
37
+ geminiConfigPath: join(homedir(), '.gemini', 'settings.json'),
38
+ codexConfigPath: join(homedir(), '.codex', 'config.toml'),
39
+ };
40
+ }
41
+ async function pathExists(p) {
42
+ try {
43
+ await access(p);
44
+ return true;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ async function readMcpConfig(mcpConfigPath) {
51
+ if (!(await pathExists(mcpConfigPath))) {
52
+ return {};
53
+ }
54
+ try {
55
+ const raw = await readFile(mcpConfigPath, 'utf8');
56
+ return JSON.parse(raw);
57
+ }
58
+ catch {
59
+ return {};
60
+ }
61
+ }
62
+ async function writeMcpConfig(mcpConfigPath, config) {
63
+ const dir = dirname(mcpConfigPath);
64
+ await mkdir(dir, { recursive: true });
65
+ await writeFile(mcpConfigPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
66
+ }
67
+ /**
68
+ * Register aigentry-brain in Gemini's settings.json (same mcpServers JSON structure as Claude).
69
+ * Fails gracefully — if the file/dir doesn't exist and Gemini isn't installed, just skip.
70
+ */
71
+ export async function registerGemini(geminiConfigPath, mcpCliPath, env) {
72
+ try {
73
+ // Read existing settings (may have other keys)
74
+ const config = await readMcpConfig(geminiConfigPath);
75
+ if (!config.mcpServers) {
76
+ config.mcpServers = {};
77
+ }
78
+ const existing = config.mcpServers['aigentry-brain'];
79
+ const entry = existing
80
+ ? { ...existing }
81
+ : { command: 'node', args: [mcpCliPath] };
82
+ if (env && Object.keys(env).length > 0) {
83
+ entry.env = {
84
+ ...entry.env,
85
+ ...env,
86
+ };
87
+ }
88
+ config.mcpServers['aigentry-brain'] = entry;
89
+ await writeMcpConfig(geminiConfigPath, config);
90
+ log(`[aigentry-brain] MCP server registered in Gemini: ${geminiConfigPath}`);
91
+ }
92
+ catch (err) {
93
+ // Gemini may not be installed — skip gracefully
94
+ const msg = err instanceof Error ? err.message : String(err);
95
+ log(`[aigentry-brain] Gemini config skipped: ${msg}`);
96
+ }
97
+ }
98
+ /**
99
+ * Register aigentry-brain in Codex's config.toml.
100
+ * Uses a simple string-based approach (no TOML library dependency):
101
+ * 1. Read existing content
102
+ * 2. Remove existing [mcp_servers.aigentry-brain] section (and its env sub-table)
103
+ * 3. Append the new section
104
+ * Fails gracefully if Codex isn't installed.
105
+ */
106
+ export async function registerCodex(codexConfigPath, mcpCliPath, env) {
107
+ try {
108
+ let existing = '';
109
+ if (await pathExists(codexConfigPath)) {
110
+ existing = await readFile(codexConfigPath, 'utf8');
111
+ }
112
+ // Remove existing [mcp_servers.aigentry-brain] section including env sub-table.
113
+ // Strategy: split into lines, track when we're inside the target section, drop those lines.
114
+ const lines = existing.split('\n');
115
+ const kept = [];
116
+ let insideTarget = false;
117
+ for (const line of lines) {
118
+ const trimmed = line.trim();
119
+ if (trimmed === '[mcp_servers.aigentry-brain]' ||
120
+ trimmed === '[mcp_servers.aigentry-brain.env]') {
121
+ insideTarget = true;
122
+ continue;
123
+ }
124
+ if (insideTarget) {
125
+ // Any new [section] header ends the target block
126
+ if (trimmed.startsWith('[') && !trimmed.startsWith('[mcp_servers.aigentry-brain')) {
127
+ insideTarget = false;
128
+ kept.push(line);
129
+ }
130
+ // Otherwise drop this line (it belongs to the old section)
131
+ continue;
132
+ }
133
+ kept.push(line);
134
+ }
135
+ // Rebuild base content, stripping trailing blank lines
136
+ let base = kept.join('\n').trimEnd();
137
+ if (base.length > 0) {
138
+ base += '\n\n';
139
+ }
140
+ // Build the new section
141
+ const argsToml = `["${mcpCliPath}"]`;
142
+ let section = `[mcp_servers.aigentry-brain]\ncommand = "node"\nargs = ${argsToml}\n`;
143
+ if (env && Object.keys(env).length > 0) {
144
+ section += '\n[mcp_servers.aigentry-brain.env]\n';
145
+ for (const [k, v] of Object.entries(env)) {
146
+ section += `${k} = "${v}"\n`;
147
+ }
148
+ }
149
+ const dir = dirname(codexConfigPath);
150
+ await mkdir(dir, { recursive: true });
151
+ await writeFile(codexConfigPath, base + section, 'utf8');
152
+ log(`[aigentry-brain] MCP server registered in Codex: ${codexConfigPath}`);
153
+ }
154
+ catch (err) {
155
+ // Codex may not be installed — skip gracefully
156
+ const msg = err instanceof Error ? err.message : String(err);
157
+ log(`[aigentry-brain] Codex config skipped: ${msg}`);
158
+ }
159
+ }
160
+ export async function runSetup(options) {
161
+ const { profileDir, mcpConfigPath, mcpCliPath, geminiConfigPath, codexConfigPath } = options;
162
+ // 1. Create profile directory
163
+ await mkdir(profileDir, { recursive: true });
164
+ log(`[aigentry-brain] Profile directory ready: ${profileDir}`);
165
+ // 2. Read existing Claude MCP config
166
+ const config = await readMcpConfig(mcpConfigPath);
167
+ // 3. Ensure mcpServers key exists
168
+ if (!config.mcpServers) {
169
+ config.mcpServers = {};
170
+ }
171
+ // 4. Add or update entry (idempotent, refreshes path on upgrade)
172
+ const existing = config.mcpServers['aigentry-brain'];
173
+ if (existing) {
174
+ // Update args path if it changed (e.g. dist/ → bin/ migration)
175
+ if (existing.args?.[0] !== mcpCliPath) {
176
+ existing.args = [mcpCliPath];
177
+ await writeMcpConfig(mcpConfigPath, config);
178
+ log(`[aigentry-brain] MCP server path updated in Claude: ${mcpCliPath}`);
179
+ }
180
+ else {
181
+ log('[aigentry-brain] MCP server entry already registered in Claude.');
182
+ }
183
+ }
184
+ else {
185
+ config.mcpServers['aigentry-brain'] = {
186
+ command: 'node',
187
+ args: [mcpCliPath],
188
+ };
189
+ await writeMcpConfig(mcpConfigPath, config);
190
+ log(`[aigentry-brain] MCP server registered in Claude: ${mcpConfigPath}`);
191
+ }
192
+ // 5. Register in Gemini (graceful skip if not installed)
193
+ await registerGemini(geminiConfigPath, mcpCliPath);
194
+ // 6. Register in Codex (graceful skip if not installed)
195
+ await registerCodex(codexConfigPath, mcpCliPath);
196
+ }
197
+ export async function runUninstall(options) {
198
+ const { mcpConfigPath } = options;
199
+ if (!(await pathExists(mcpConfigPath))) {
200
+ log('[aigentry-brain] No MCP config found — nothing to remove.');
201
+ return;
202
+ }
203
+ const config = await readMcpConfig(mcpConfigPath);
204
+ if (!config.mcpServers || !config.mcpServers['aigentry-brain']) {
205
+ log('[aigentry-brain] MCP server entry not found — nothing to remove.');
206
+ return;
207
+ }
208
+ delete config.mcpServers['aigentry-brain'];
209
+ await writeMcpConfig(mcpConfigPath, config);
210
+ log(`[aigentry-brain] MCP server entry removed from: ${mcpConfigPath}`);
211
+ log('[aigentry-brain] Uninstall complete. Restart Claude Code to deactivate.');
212
+ }
213
+ // Run as standalone script (postinstall / aigentry-brain-setup bin)
214
+ if (process.argv[1] === fileURLToPath(import.meta.url) ||
215
+ process.argv[1]?.endsWith('dist/cli/setup.js') ||
216
+ process.argv[1]?.endsWith('bin/aigentry-brain-setup.mjs')) {
217
+ const options = defaultSetupOptions();
218
+ runSetup(options)
219
+ .then(async () => {
220
+ // After basic setup, attempt full wizard if gh is available
221
+ const { runSetupWizard } = await import('./SetupWizard.js');
222
+ const result = await runSetupWizard({
223
+ mcpConfigPath: options.mcpConfigPath,
224
+ mcpCliPath: options.mcpCliPath,
225
+ profileDir: options.profileDir,
226
+ geminiConfigPath: options.geminiConfigPath,
227
+ codexConfigPath: options.codexConfigPath,
228
+ });
229
+ if (!result.success) {
230
+ log('[aigentry-brain] Run "aigentry-brain-setup" to complete setup.');
231
+ }
232
+ })
233
+ .catch((err) => {
234
+ console.error(`[aigentry-brain] Setup failed: ${String(err)}`);
235
+ // Don't exit(1) — basic setup may have succeeded
236
+ });
237
+ }
238
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface ScoredEvidence {
2
+ tokens: number;
3
+ score?: number;
4
+ }
5
+ export declare function calculateRecallConfidence(evidence: ScoredEvidence[]): number;
6
+ export declare function shouldAskClarification(recallConfidence: number, threshold?: number): boolean;
7
+ export declare function evaluateRecallConfidence(evidence: ScoredEvidence[], threshold?: number): {
8
+ recallConfidence: number;
9
+ threshold: number;
10
+ shouldAskClarification: boolean;
11
+ };
@@ -0,0 +1,32 @@
1
+ function clamp01(value) {
2
+ if (Number.isNaN(value))
3
+ return 0;
4
+ return Math.max(0, Math.min(1, value));
5
+ }
6
+ export function calculateRecallConfidence(evidence) {
7
+ if (evidence.length === 0)
8
+ return 0;
9
+ let weightedScore = 0;
10
+ let totalWeight = 0;
11
+ for (const item of evidence) {
12
+ const weight = Math.max(1, item.tokens);
13
+ const score = clamp01(item.score ?? 0);
14
+ weightedScore += (score * weight);
15
+ totalWeight += weight;
16
+ }
17
+ if (totalWeight <= 0)
18
+ return 0;
19
+ return clamp01(weightedScore / totalWeight);
20
+ }
21
+ export function shouldAskClarification(recallConfidence, threshold = 0.65) {
22
+ return recallConfidence < threshold;
23
+ }
24
+ export function evaluateRecallConfidence(evidence, threshold = 0.65) {
25
+ const recallConfidence = calculateRecallConfidence(evidence);
26
+ return {
27
+ recallConfidence,
28
+ threshold,
29
+ shouldAskClarification: shouldAskClarification(recallConfidence, threshold),
30
+ };
31
+ }
32
+ //# sourceMappingURL=ConfidenceGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfidenceGuard.js","sourceRoot":"","sources":["../../src/context/ConfidenceGuard.ts"],"names":[],"mappings":"AAKA,SAAS,OAAO,CAAC,KAAa;IAC5B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAA0B;IAClE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEpC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACvC,aAAa,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;QAClC,WAAW,IAAI,MAAM,CAAC;IACxB,CAAC;IAED,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,gBAAwB,EACxB,SAAS,GAAG,IAAI;IAEhB,OAAO,gBAAgB,GAAG,SAAS,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAA0B,EAC1B,SAAS,GAAG,IAAI;IAMhB,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC7D,OAAO;QACL,gBAAgB;QAChB,SAAS;QACT,sBAAsB,EAAE,sBAAsB,CAAC,gBAAgB,EAAE,SAAS,CAAC;KAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type ContextMode = 'qa' | 'coding' | 'strategy';
2
+ export interface SlotBudget {
3
+ minTokens: number;
4
+ targetTokens: number;
5
+ }
6
+ export interface ContextBudgetPlan {
7
+ windowTokens: number;
8
+ inputBudget: number;
9
+ outputReserve: number;
10
+ mustKeepCap: number;
11
+ recallConfidenceThreshold: number;
12
+ slots: {
13
+ systemPolicy: SlotBudget;
14
+ userRequest: SlotBudget;
15
+ mustKeep: SlotBudget;
16
+ conversationSummary: SlotBudget;
17
+ retrievalEvidence: SlotBudget;
18
+ repackBuffer: SlotBudget;
19
+ };
20
+ }
21
+ export declare function buildContextBudgetPlan(windowTokens: number, mode?: ContextMode): ContextBudgetPlan;