@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.
- package/bin/aigentry-brain-mcp.mjs +17 -0
- package/bin/aigentry-brain-setup.mjs +17 -0
- package/bin/aigentry-brain.mjs +17 -0
- package/dist/audit/AuditTrail.d.ts +15 -0
- package/dist/audit/AuditTrail.js +43 -0
- package/dist/audit/AuditTrail.js.map +1 -0
- package/dist/backend/GitBackend.d.ts +27 -0
- package/dist/backend/GitBackend.js +201 -0
- package/dist/backend/GitBackend.js.map +1 -0
- package/dist/backend/SyncBackend.d.ts +13 -0
- package/dist/backend/SyncBackend.js +2 -0
- package/dist/backend/SyncBackend.js.map +1 -0
- package/dist/cli/AutoUpdater.d.ts +7 -0
- package/dist/cli/AutoUpdater.js +275 -0
- package/dist/cli/AutoUpdater.js.map +1 -0
- package/dist/cli/ConfigStore.d.ts +17 -0
- package/dist/cli/ConfigStore.js +50 -0
- package/dist/cli/ConfigStore.js.map +1 -0
- package/dist/cli/GhIntegration.d.ts +55 -0
- package/dist/cli/GhIntegration.js +192 -0
- package/dist/cli/GhIntegration.js.map +1 -0
- package/dist/cli/Prerequisites.d.ts +48 -0
- package/dist/cli/Prerequisites.js +182 -0
- package/dist/cli/Prerequisites.js.map +1 -0
- package/dist/cli/SetupWizard.d.ts +26 -0
- package/dist/cli/SetupWizard.js +407 -0
- package/dist/cli/SetupWizard.js.map +1 -0
- package/dist/cli/braincli.d.ts +2 -0
- package/dist/cli/braincli.js +260 -0
- package/dist/cli/braincli.js.map +1 -0
- package/dist/cli/setup.d.ts +25 -0
- package/dist/cli/setup.js +238 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/context/ConfidenceGuard.d.ts +11 -0
- package/dist/context/ConfidenceGuard.js +32 -0
- package/dist/context/ConfidenceGuard.js.map +1 -0
- package/dist/context/ContextBudgetPolicy.d.ts +21 -0
- package/dist/context/ContextBudgetPolicy.js +136 -0
- package/dist/context/ContextBudgetPolicy.js.map +1 -0
- package/dist/context/ContextPacker.d.ts +30 -0
- package/dist/context/ContextPacker.js +219 -0
- package/dist/context/ContextPacker.js.map +1 -0
- package/dist/context/ContextRestoreService.d.ts +39 -0
- package/dist/context/ContextRestoreService.js +134 -0
- package/dist/context/ContextRestoreService.js.map +1 -0
- package/dist/contract/BrainContract.d.ts +93 -0
- package/dist/contract/BrainContract.js +245 -0
- package/dist/contract/BrainContract.js.map +1 -0
- package/dist/core/ContentDedup.d.ts +43 -0
- package/dist/core/ContentDedup.js +145 -0
- package/dist/core/ContentDedup.js.map +1 -0
- package/dist/core/EntityGraph.d.ts +66 -0
- package/dist/core/EntityGraph.js +196 -0
- package/dist/core/EntityGraph.js.map +1 -0
- package/dist/core/EntrySchema.d.ts +46 -0
- package/dist/core/EntrySchema.js +4 -0
- package/dist/core/EntrySchema.js.map +1 -0
- package/dist/core/GraphStore.d.ts +16 -0
- package/dist/core/GraphStore.js +29 -0
- package/dist/core/GraphStore.js.map +1 -0
- package/dist/core/MemoryDecay.d.ts +49 -0
- package/dist/core/MemoryDecay.js +113 -0
- package/dist/core/MemoryDecay.js.map +1 -0
- package/dist/core/ProfileFormat.d.ts +38 -0
- package/dist/core/ProfileFormat.js +254 -0
- package/dist/core/ProfileFormat.js.map +1 -0
- package/dist/core/ProfileManager.d.ts +80 -0
- package/dist/core/ProfileManager.js +269 -0
- package/dist/core/ProfileManager.js.map +1 -0
- package/dist/core/SchemaMigration.d.ts +12 -0
- package/dist/core/SchemaMigration.js +34 -0
- package/dist/core/SchemaMigration.js.map +1 -0
- package/dist/crypto/AgeCrypto.d.ts +26 -0
- package/dist/crypto/AgeCrypto.js +101 -0
- package/dist/crypto/AgeCrypto.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/BrainMcpServer.d.ts +13 -0
- package/dist/mcp/BrainMcpServer.js +223 -0
- package/dist/mcp/BrainMcpServer.js.map +1 -0
- package/dist/mcp/cli.d.ts +2 -0
- package/dist/mcp/cli.js +107 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/metrics/ResumeMetrics.d.ts +20 -0
- package/dist/metrics/ResumeMetrics.js +46 -0
- package/dist/metrics/ResumeMetrics.js.map +1 -0
- package/dist/peers/PeerStore.d.ts +17 -0
- package/dist/peers/PeerStore.js +65 -0
- package/dist/peers/PeerStore.js.map +1 -0
- package/dist/policy/PolicyEngine.d.ts +16 -0
- package/dist/policy/PolicyEngine.js +70 -0
- package/dist/policy/PolicyEngine.js.map +1 -0
- package/dist/policy/PolicyEnvelope.d.ts +7 -0
- package/dist/policy/PolicyEnvelope.js +2 -0
- package/dist/policy/PolicyEnvelope.js.map +1 -0
- package/dist/policy/RetentionParser.d.ts +6 -0
- package/dist/policy/RetentionParser.js +48 -0
- package/dist/policy/RetentionParser.js.map +1 -0
- package/dist/shared/AtomicWrite.d.ts +1 -0
- package/dist/shared/AtomicWrite.js +11 -0
- package/dist/shared/AtomicWrite.js.map +1 -0
- package/dist/shared/Clock.d.ts +11 -0
- package/dist/shared/Clock.js +17 -0
- package/dist/shared/Clock.js.map +1 -0
- package/dist/shared/Config.d.ts +15 -0
- package/dist/shared/Config.js +67 -0
- package/dist/shared/Config.js.map +1 -0
- package/dist/shared/Encryption.d.ts +19 -0
- package/dist/shared/Encryption.js +47 -0
- package/dist/shared/Encryption.js.map +1 -0
- package/dist/shared/Logger.d.ts +12 -0
- package/dist/shared/Logger.js +40 -0
- package/dist/shared/Logger.js.map +1 -0
- package/dist/shared/Mutex.d.ts +7 -0
- package/dist/shared/Mutex.js +34 -0
- package/dist/shared/Mutex.js.map +1 -0
- package/dist/shared/SetupErrors.d.ts +31 -0
- package/dist/shared/SetupErrors.js +155 -0
- package/dist/shared/SetupErrors.js.map +1 -0
- package/dist/status/SyncStatusStore.d.ts +17 -0
- package/dist/status/SyncStatusStore.js +48 -0
- package/dist/status/SyncStatusStore.js.map +1 -0
- package/dist/sync/AutoCommitter.d.ts +17 -0
- package/dist/sync/AutoCommitter.js +68 -0
- package/dist/sync/AutoCommitter.js.map +1 -0
- package/dist/sync/ConflictResolver.d.ts +7 -0
- package/dist/sync/ConflictResolver.js +56 -0
- package/dist/sync/ConflictResolver.js.map +1 -0
- package/dist/sync/PushPullManager.d.ts +23 -0
- package/dist/sync/PushPullManager.js +155 -0
- package/dist/sync/PushPullManager.js.map +1 -0
- package/dist/sync/SyncEngine.d.ts +43 -0
- package/dist/sync/SyncEngine.js +145 -0
- package/dist/sync/SyncEngine.js.map +1 -0
- 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;
|