family-ai-agent 1.0.2 → 1.0.3

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.
@@ -0,0 +1,294 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import boxen from 'boxen';
5
+ import { saveUserConfig, getAllModels, getConfigPath, } from '../config/user-config.js';
6
+ /**
7
+ * Display welcome banner for setup
8
+ */
9
+ function showSetupBanner() {
10
+ const banner = boxen(chalk.bold.cyan('Family AI Agent Setup') +
11
+ '\n\n' +
12
+ chalk.white('Configure your AI agent in a few simple steps') +
13
+ '\n' +
14
+ chalk.gray('Your settings will be saved locally'), {
15
+ padding: 1,
16
+ margin: 1,
17
+ borderStyle: 'round',
18
+ borderColor: 'cyan',
19
+ });
20
+ console.log(banner);
21
+ }
22
+ /**
23
+ * Test API connection
24
+ */
25
+ async function testConnection(apiKey, baseUrl) {
26
+ try {
27
+ const response = await fetch(`${baseUrl}/models`, {
28
+ headers: {
29
+ Authorization: `Bearer ${apiKey}`,
30
+ 'HTTP-Referer': 'https://family-ai-agent.local',
31
+ 'X-Title': 'Family AI Agent Setup',
32
+ },
33
+ });
34
+ if (response.ok) {
35
+ return { success: true };
36
+ }
37
+ const errorData = await response.json().catch(() => ({}));
38
+ return {
39
+ success: false,
40
+ error: errorData?.error?.toString() || `HTTP ${response.status}`,
41
+ };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ success: false,
46
+ error: error instanceof Error ? error.message : 'Connection failed',
47
+ };
48
+ }
49
+ }
50
+ /**
51
+ * Run the interactive setup wizard
52
+ */
53
+ export async function runSetupWizard() {
54
+ showSetupBanner();
55
+ try {
56
+ // Step 1: API Key
57
+ console.log(chalk.bold('\nšŸ“ Step 1: API Configuration\n'));
58
+ const { apiKey } = await inquirer.prompt([
59
+ {
60
+ type: 'password',
61
+ name: 'apiKey',
62
+ message: 'Enter your OpenRouter API Key:',
63
+ mask: '*',
64
+ validate: (input) => {
65
+ if (!input || input.trim().length === 0) {
66
+ return 'API key is required';
67
+ }
68
+ if (input.length < 10) {
69
+ return 'API key seems too short';
70
+ }
71
+ return true;
72
+ },
73
+ },
74
+ ]);
75
+ // Step 2: Base URL
76
+ const { baseUrl } = await inquirer.prompt([
77
+ {
78
+ type: 'input',
79
+ name: 'baseUrl',
80
+ message: 'API Base URL:',
81
+ default: 'https://openrouter.ai/api/v1',
82
+ validate: (input) => {
83
+ try {
84
+ new URL(input);
85
+ return true;
86
+ }
87
+ catch {
88
+ return 'Please enter a valid URL';
89
+ }
90
+ },
91
+ },
92
+ ]);
93
+ // Test connection
94
+ const spinner = ora('Testing API connection...').start();
95
+ const testResult = await testConnection(apiKey, baseUrl);
96
+ if (!testResult.success) {
97
+ spinner.fail(`Connection failed: ${testResult.error}`);
98
+ const { continueAnyway } = await inquirer.prompt([
99
+ {
100
+ type: 'confirm',
101
+ name: 'continueAnyway',
102
+ message: 'Continue with setup anyway?',
103
+ default: false,
104
+ },
105
+ ]);
106
+ if (!continueAnyway) {
107
+ console.log(chalk.yellow('\nSetup cancelled. Please check your API key and try again.\n'));
108
+ return false;
109
+ }
110
+ }
111
+ else {
112
+ spinner.succeed('API connection successful!');
113
+ }
114
+ // Step 3: Model Selection
115
+ console.log(chalk.bold('\nšŸ¤– Step 2: Model Configuration\n'));
116
+ const models = getAllModels();
117
+ const modelChoices = [
118
+ ...models.map((m) => ({
119
+ name: `${m.name} (${m.id})`,
120
+ value: m.id,
121
+ })),
122
+ { name: chalk.gray('Enter custom model ID...'), value: '__custom__' },
123
+ ];
124
+ const { defaultModel } = await inquirer.prompt([
125
+ {
126
+ type: 'list',
127
+ name: 'defaultModel',
128
+ message: 'Select your default model:',
129
+ choices: modelChoices,
130
+ default: 'anthropic/claude-3.5-sonnet',
131
+ },
132
+ ]);
133
+ let finalDefaultModel = defaultModel;
134
+ if (defaultModel === '__custom__') {
135
+ const { customModel } = await inquirer.prompt([
136
+ {
137
+ type: 'input',
138
+ name: 'customModel',
139
+ message: 'Enter custom model ID (e.g., provider/model-name):',
140
+ validate: (input) => {
141
+ if (!input || input.trim().length === 0) {
142
+ return 'Model ID is required';
143
+ }
144
+ return true;
145
+ },
146
+ },
147
+ ]);
148
+ finalDefaultModel = customModel;
149
+ }
150
+ // Step 4: Fast Model (optional)
151
+ const { configureFastModel } = await inquirer.prompt([
152
+ {
153
+ type: 'confirm',
154
+ name: 'configureFastModel',
155
+ message: 'Configure a separate fast model for quick tasks?',
156
+ default: true,
157
+ },
158
+ ]);
159
+ let fastModel = 'anthropic/claude-3-haiku';
160
+ if (configureFastModel) {
161
+ const { selectedFastModel } = await inquirer.prompt([
162
+ {
163
+ type: 'list',
164
+ name: 'selectedFastModel',
165
+ message: 'Select fast model:',
166
+ choices: modelChoices,
167
+ default: 'anthropic/claude-3-haiku',
168
+ },
169
+ ]);
170
+ if (selectedFastModel === '__custom__') {
171
+ const { customFastModel } = await inquirer.prompt([
172
+ {
173
+ type: 'input',
174
+ name: 'customFastModel',
175
+ message: 'Enter custom fast model ID:',
176
+ },
177
+ ]);
178
+ fastModel = customFastModel;
179
+ }
180
+ else {
181
+ fastModel = selectedFastModel;
182
+ }
183
+ }
184
+ // Step 5: Safety Settings
185
+ console.log(chalk.bold('\nšŸ›”ļø Step 3: Safety Settings\n'));
186
+ const { enableSafetyFilters, enableAuditLogging } = await inquirer.prompt([
187
+ {
188
+ type: 'confirm',
189
+ name: 'enableSafetyFilters',
190
+ message: 'Enable content safety filters?',
191
+ default: true,
192
+ },
193
+ {
194
+ type: 'confirm',
195
+ name: 'enableAuditLogging',
196
+ message: 'Enable audit logging?',
197
+ default: true,
198
+ },
199
+ ]);
200
+ // Save configuration
201
+ console.log();
202
+ const saveSpinner = ora('Saving configuration...').start();
203
+ try {
204
+ const config = {
205
+ apiKey,
206
+ baseUrl,
207
+ defaultModel: finalDefaultModel,
208
+ fastModel,
209
+ embeddingModel: 'openai/text-embedding-3-small',
210
+ enableSafetyFilters,
211
+ enableAuditLogging,
212
+ customModels: [],
213
+ };
214
+ saveUserConfig(config);
215
+ saveSpinner.succeed('Configuration saved!');
216
+ // Show summary
217
+ console.log(boxen(chalk.bold.green('Setup Complete!') +
218
+ '\n\n' +
219
+ chalk.white('Configuration saved to:') +
220
+ '\n' +
221
+ chalk.gray(getConfigPath()) +
222
+ '\n\n' +
223
+ chalk.white('Default Model: ') +
224
+ chalk.cyan(finalDefaultModel) +
225
+ '\n' +
226
+ chalk.white('Fast Model: ') +
227
+ chalk.cyan(fastModel) +
228
+ '\n\n' +
229
+ chalk.gray('Run `family-ai-agent` to start chatting!'), {
230
+ padding: 1,
231
+ margin: 1,
232
+ borderStyle: 'round',
233
+ borderColor: 'green',
234
+ }));
235
+ return true;
236
+ }
237
+ catch (error) {
238
+ saveSpinner.fail('Failed to save configuration');
239
+ console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
240
+ return false;
241
+ }
242
+ }
243
+ catch (error) {
244
+ // Handle Ctrl+C gracefully
245
+ if (error.name === 'ExitPromptError') {
246
+ console.log(chalk.yellow('\n\nSetup cancelled.\n'));
247
+ return false;
248
+ }
249
+ throw error;
250
+ }
251
+ }
252
+ /**
253
+ * Quick setup with minimal prompts
254
+ */
255
+ export async function runQuickSetup(apiKey) {
256
+ const spinner = ora('Configuring with defaults...').start();
257
+ try {
258
+ const config = {
259
+ apiKey,
260
+ baseUrl: 'https://openrouter.ai/api/v1',
261
+ defaultModel: 'anthropic/claude-3.5-sonnet',
262
+ fastModel: 'anthropic/claude-3-haiku',
263
+ embeddingModel: 'openai/text-embedding-3-small',
264
+ enableSafetyFilters: true,
265
+ enableAuditLogging: true,
266
+ customModels: [],
267
+ };
268
+ saveUserConfig(config);
269
+ spinner.succeed('Configuration saved with defaults!');
270
+ return true;
271
+ }
272
+ catch (error) {
273
+ spinner.fail('Failed to save configuration');
274
+ console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
275
+ return false;
276
+ }
277
+ }
278
+ /**
279
+ * Check if setup is needed and run wizard if so
280
+ */
281
+ export async function checkAndRunSetup() {
282
+ const { configExists } = await import('../config/user-config.js');
283
+ if (configExists()) {
284
+ return true; // Already configured
285
+ }
286
+ console.log(chalk.yellow('\nāš ļø No configuration found. Starting setup wizard...\n'));
287
+ return runSetupWizard();
288
+ }
289
+ export default {
290
+ runSetupWizard,
291
+ runQuickSetup,
292
+ checkAndRunSetup,
293
+ };
294
+ //# sourceMappingURL=setup-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../../src/cli/setup-wizard.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  export declare const config: {
2
- OPENROUTER_API_KEY: string;
3
2
  OPENROUTER_BASE_URL: string;
4
3
  DEFAULT_MODEL: string;
5
4
  FAST_MODEL: string;
6
5
  EMBEDDING_MODEL: string;
6
+ ENABLE_CONTENT_FILTER: boolean;
7
+ ENABLE_AUDIT_LOGGING: boolean;
7
8
  DB_HOST: string;
8
9
  DB_PORT: number;
9
10
  DB_USER: string;
@@ -13,9 +14,7 @@ export declare const config: {
13
14
  REDIS_PORT: number;
14
15
  API_PORT: number;
15
16
  API_HOST: string;
16
- ENABLE_CONTENT_FILTER: boolean;
17
17
  ENABLE_PII_DETECTION: boolean;
18
- ENABLE_AUDIT_LOGGING: boolean;
19
18
  MAX_TOKENS_PER_REQUEST: number;
20
19
  RATE_LIMIT_MAX: number;
21
20
  RATE_LIMIT_WINDOW_MS: number;
@@ -25,11 +24,15 @@ export declare const config: {
25
24
  LOG_LEVEL: "debug" | "info" | "warn" | "error";
26
25
  LOG_FORMAT: "json" | "pretty";
27
26
  NODE_ENV: "development" | "production" | "test";
27
+ OPENROUTER_API_KEY?: string | undefined;
28
28
  DATABASE_URL?: string | undefined;
29
29
  REDIS_URL?: string | undefined;
30
30
  TAVILY_API_KEY?: string | undefined;
31
31
  SERP_API_KEY?: string | undefined;
32
32
  };
33
+ export declare const isConfigured: () => boolean;
34
+ export declare const hasUserConfig: () => boolean;
35
+ export declare const getUserConfigPath: () => string;
33
36
  export declare const getDatabaseUrl: () => string;
34
37
  export declare const getRedisUrl: () => string;
35
38
  export declare const isProduction: () => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAuEA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAe,CAAC;AAEnC,eAAO,MAAM,cAAc,QAAO,MAGjC,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,MAG9B,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,OAA2C,CAAC;AAC5E,eAAO,MAAM,aAAa,QAAO,OAA4C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAuNA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAe,CAAC;AAGnC,eAAO,MAAM,YAAY,QAAO,OAE/B,CAAC;AAGF,eAAO,MAAM,aAAa,QAAO,OAEhC,CAAC;AAGF,eAAO,MAAM,iBAAiB,QAAO,MAEpC,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,MAGjC,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,MAG9B,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,OAA2C,CAAC;AAC5E,eAAO,MAAM,aAAa,QAAO,OAA4C,CAAC"}
@@ -1,9 +1,72 @@
1
1
  import { config as dotenvConfig } from 'dotenv';
2
2
  import { z } from 'zod';
3
+ import { existsSync, readFileSync } from 'fs';
4
+ import { homedir } from 'os';
5
+ import { join } from 'path';
3
6
  dotenvConfig();
7
+ // User config path
8
+ const USER_CONFIG_PATH = join(homedir(), '.family-ai-agent', 'config.json');
9
+ // Try to load user config
10
+ function loadUserConfigFile() {
11
+ if (!existsSync(USER_CONFIG_PATH)) {
12
+ return null;
13
+ }
14
+ try {
15
+ const content = readFileSync(USER_CONFIG_PATH, 'utf-8');
16
+ return JSON.parse(content);
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ // Get config value with priority: user config > env > default
23
+ function getConfigValue(userConfig, userKey, envKey, envValue) {
24
+ // Priority 1: User config
25
+ if (userConfig && userKey in userConfig) {
26
+ const value = userConfig[userKey];
27
+ if (typeof value === 'string')
28
+ return value;
29
+ if (typeof value === 'number')
30
+ return String(value);
31
+ if (typeof value === 'boolean')
32
+ return String(value);
33
+ }
34
+ // Priority 2: Environment variable
35
+ return envValue;
36
+ }
37
+ // Load user config if available
38
+ const userConfig = loadUserConfigFile();
39
+ // Build merged environment for Zod schema
40
+ const mergedEnv = {
41
+ ...process.env,
42
+ // Override with user config if available
43
+ OPENROUTER_API_KEY: getConfigValue(userConfig, 'apiKey', 'OPENROUTER_API_KEY', process.env.OPENROUTER_API_KEY),
44
+ OPENROUTER_BASE_URL: getConfigValue(userConfig, 'baseUrl', 'OPENROUTER_BASE_URL', process.env.OPENROUTER_BASE_URL),
45
+ DEFAULT_MODEL: getConfigValue(userConfig, 'defaultModel', 'DEFAULT_MODEL', process.env.DEFAULT_MODEL),
46
+ FAST_MODEL: getConfigValue(userConfig, 'fastModel', 'FAST_MODEL', process.env.FAST_MODEL),
47
+ EMBEDDING_MODEL: getConfigValue(userConfig, 'embeddingModel', 'EMBEDDING_MODEL', process.env.EMBEDDING_MODEL),
48
+ ENABLE_CONTENT_FILTER: getConfigValue(userConfig, 'enableSafetyFilters', 'ENABLE_CONTENT_FILTER', process.env.ENABLE_CONTENT_FILTER),
49
+ ENABLE_AUDIT_LOGGING: getConfigValue(userConfig, 'enableAuditLogging', 'ENABLE_AUDIT_LOGGING', process.env.ENABLE_AUDIT_LOGGING),
50
+ // Database from user config
51
+ DB_HOST: userConfig?.database && typeof userConfig.database === 'object'
52
+ ? userConfig.database.host
53
+ : process.env.DB_HOST,
54
+ DB_PORT: userConfig?.database && typeof userConfig.database === 'object'
55
+ ? String(userConfig.database.port)
56
+ : process.env.DB_PORT,
57
+ DB_USER: userConfig?.database && typeof userConfig.database === 'object'
58
+ ? userConfig.database.user
59
+ : process.env.DB_USER,
60
+ DB_PASSWORD: userConfig?.database && typeof userConfig.database === 'object'
61
+ ? userConfig.database.password
62
+ : process.env.DB_PASSWORD,
63
+ DB_NAME: userConfig?.database && typeof userConfig.database === 'object'
64
+ ? userConfig.database.name
65
+ : process.env.DB_NAME,
66
+ };
4
67
  const envSchema = z.object({
5
- // OpenRouter
6
- OPENROUTER_API_KEY: z.string().min(1, 'OpenRouter API key is required'),
68
+ // OpenRouter - now optional (can be set via user config)
69
+ OPENROUTER_API_KEY: z.string().min(1).optional(),
7
70
  OPENROUTER_BASE_URL: z.string().url().default('https://openrouter.ai/api/v1'),
8
71
  // Models
9
72
  DEFAULT_MODEL: z.string().default('anthropic/claude-3.5-sonnet'),
@@ -44,15 +107,61 @@ const envSchema = z.object({
44
107
  NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
45
108
  });
46
109
  function loadConfig() {
47
- const parsed = envSchema.safeParse(process.env);
110
+ const parsed = envSchema.safeParse(mergedEnv);
48
111
  if (!parsed.success) {
112
+ // More helpful error message
113
+ const errors = parsed.error.format();
49
114
  console.error('Configuration validation failed:');
50
- console.error(parsed.error.format());
51
- throw new Error('Invalid configuration. Check your .env file.');
115
+ console.error(errors);
116
+ // Check if it's just missing API key
117
+ if (!mergedEnv.OPENROUTER_API_KEY) {
118
+ // Don't throw - let CLI handle setup
119
+ return {
120
+ OPENROUTER_API_KEY: undefined,
121
+ OPENROUTER_BASE_URL: 'https://openrouter.ai/api/v1',
122
+ DEFAULT_MODEL: 'anthropic/claude-3.5-sonnet',
123
+ FAST_MODEL: 'anthropic/claude-3-haiku',
124
+ EMBEDDING_MODEL: 'openai/text-embedding-3-small',
125
+ DB_HOST: 'localhost',
126
+ DB_PORT: 5432,
127
+ DB_USER: 'familyai',
128
+ DB_PASSWORD: 'familyai123',
129
+ DB_NAME: 'familyai',
130
+ REDIS_HOST: 'localhost',
131
+ REDIS_PORT: 6379,
132
+ API_PORT: 3000,
133
+ API_HOST: '0.0.0.0',
134
+ ENABLE_CONTENT_FILTER: true,
135
+ ENABLE_PII_DETECTION: true,
136
+ ENABLE_AUDIT_LOGGING: true,
137
+ MAX_TOKENS_PER_REQUEST: 4096,
138
+ RATE_LIMIT_MAX: 100,
139
+ RATE_LIMIT_WINDOW_MS: 60000,
140
+ SANDBOX_ENABLED: true,
141
+ SANDBOX_TIMEOUT_MS: 30000,
142
+ SANDBOX_MEMORY_LIMIT_MB: 256,
143
+ LOG_LEVEL: 'info',
144
+ LOG_FORMAT: 'json',
145
+ NODE_ENV: 'development',
146
+ };
147
+ }
148
+ throw new Error('Invalid configuration. Check your settings.');
52
149
  }
53
150
  return parsed.data;
54
151
  }
55
152
  export const config = loadConfig();
153
+ // Check if config is complete (has API key)
154
+ export const isConfigured = () => {
155
+ return Boolean(config.OPENROUTER_API_KEY);
156
+ };
157
+ // Check if using user config file
158
+ export const hasUserConfig = () => {
159
+ return userConfig !== null;
160
+ };
161
+ // Get user config path
162
+ export const getUserConfigPath = () => {
163
+ return USER_CONFIG_PATH;
164
+ };
56
165
  export const getDatabaseUrl = () => {
57
166
  if (config.DATABASE_URL)
58
167
  return config.DATABASE_URL;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}