@agent-relay/user-directory 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.
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @relay/user-directory
3
+ *
4
+ * User directory service for per-user credential storage on workspace volumes.
5
+ */
6
+ export { UserDirectoryService, getDefaultDataDir, getUserDirectoryService, createUserDirectoryService, } from './user-directory.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @relay/user-directory
3
+ *
4
+ * User directory service for per-user credential storage on workspace volumes.
5
+ */
6
+ export { UserDirectoryService, getDefaultDataDir, getUserDirectoryService, createUserDirectoryService, } from './user-directory.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * User Directory Service
3
+ *
4
+ * Manages per-user directories on workspace volumes for CLI credential storage.
5
+ * Each user gets their own home directory at /data/users/{userId}/ with
6
+ * provider-specific subdirectories for credentials.
7
+ *
8
+ * Structure:
9
+ * /data/
10
+ * └── users/
11
+ * ├── {userId1}/
12
+ * │ ├── .claude/
13
+ * │ │ └── .credentials.json
14
+ * │ ├── .codex/
15
+ * │ │ └── credentials.json
16
+ * │ └── .config/
17
+ * │ └── gcloud/
18
+ * │ └── application_default_credentials.json
19
+ * └── {userId2}/
20
+ * └── ...
21
+ */
22
+ /**
23
+ * Service for managing per-user directories on workspace volumes.
24
+ * Enables multi-user credential storage without conflicts.
25
+ */
26
+ export declare class UserDirectoryService {
27
+ private baseDir;
28
+ private usersDir;
29
+ /**
30
+ * Create a new UserDirectoryService.
31
+ * @param baseDir - Base data directory (e.g., /data)
32
+ */
33
+ constructor(baseDir: string);
34
+ /**
35
+ * Get the home directory path for a user.
36
+ * Creates the directory if it doesn't exist.
37
+ *
38
+ * @param userId - User ID (UUID or similar)
39
+ * @returns Absolute path to user's home directory
40
+ * @throws Error if userId is invalid
41
+ */
42
+ getUserHome(userId: string): string;
43
+ /**
44
+ * Ensure a provider's credential directory exists for a user.
45
+ *
46
+ * @param userId - User ID
47
+ * @param provider - Provider name (claude, codex, gemini, etc.)
48
+ * @returns Absolute path to provider directory
49
+ */
50
+ ensureProviderDir(userId: string, provider: string): string;
51
+ /**
52
+ * Initialize a complete user environment with all provider directories.
53
+ *
54
+ * @param userId - User ID
55
+ * @returns User's home directory path
56
+ */
57
+ initializeUserEnvironment(userId: string): string;
58
+ /**
59
+ * Get environment variables for spawning an agent with user-specific HOME.
60
+ *
61
+ * @param userId - User ID
62
+ * @returns Environment variables to merge with process.env
63
+ */
64
+ getUserEnvironment(userId: string): Record<string, string>;
65
+ /**
66
+ * List all user IDs that have directories.
67
+ *
68
+ * @returns Array of user IDs
69
+ */
70
+ listUsers(): string[];
71
+ /**
72
+ * Check if a user has an existing directory.
73
+ *
74
+ * @param userId - User ID
75
+ * @returns True if directory exists
76
+ */
77
+ hasUserDirectory(userId: string): boolean;
78
+ /**
79
+ * Get the path to a provider's credentials file for a user.
80
+ *
81
+ * @param userId - User ID
82
+ * @param provider - Provider name
83
+ * @returns Absolute path to credentials file
84
+ */
85
+ getProviderCredentialPath(userId: string, provider: string): string;
86
+ /**
87
+ * Write an API key to the appropriate credential file for a provider.
88
+ * Handles provider-specific formats (e.g., Gemini uses .env format).
89
+ *
90
+ * @param userId - User ID
91
+ * @param provider - Provider name (gemini, google, etc.)
92
+ * @param apiKey - The API key to write
93
+ * @returns Path to the written credential file
94
+ */
95
+ writeApiKeyCredential(userId: string, provider: string, apiKey: string): string;
96
+ /**
97
+ * Validate a user ID to prevent path traversal and other issues.
98
+ *
99
+ * @param userId - User ID to validate
100
+ * @throws Error if userId is invalid
101
+ */
102
+ private validateUserId;
103
+ /**
104
+ * Ensure a directory exists, creating it recursively if needed.
105
+ */
106
+ private ensureDirectory;
107
+ }
108
+ /**
109
+ * Get the default data directory for user directories.
110
+ * Uses AGENT_RELAY_DATA_DIR if set, otherwise /data (for Fly.io volumes).
111
+ */
112
+ export declare function getDefaultDataDir(): string;
113
+ /**
114
+ * Get the singleton UserDirectoryService instance.
115
+ */
116
+ export declare function getUserDirectoryService(): UserDirectoryService;
117
+ /**
118
+ * Create a new UserDirectoryService for testing or custom paths.
119
+ */
120
+ export declare function createUserDirectoryService(baseDir: string): UserDirectoryService;
121
+ //# sourceMappingURL=user-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-directory.d.ts","sourceRoot":"","sources":["../src/user-directory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAkDH;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IAEzB;;;OAGG;gBACS,OAAO,EAAE,MAAM;IAS3B;;;;;;;OAOG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IASnC;;;;;;OAMG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAmB3D;;;;;OAKG;IACH,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAcjD;;;;;OAKG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAU1D;;;;OAIG;IACH,SAAS,IAAI,MAAM,EAAE;IAWrB;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKzC;;;;;;OAMG;IACH,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAWnE;;;;;;;;OAQG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAyB/E;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,eAAe;CAKxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAOD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,CAK9D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAEhF"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * User Directory Service
3
+ *
4
+ * Manages per-user directories on workspace volumes for CLI credential storage.
5
+ * Each user gets their own home directory at /data/users/{userId}/ with
6
+ * provider-specific subdirectories for credentials.
7
+ *
8
+ * Structure:
9
+ * /data/
10
+ * └── users/
11
+ * ├── {userId1}/
12
+ * │ ├── .claude/
13
+ * │ │ └── .credentials.json
14
+ * │ ├── .codex/
15
+ * │ │ └── credentials.json
16
+ * │ └── .config/
17
+ * │ └── gcloud/
18
+ * │ └── application_default_credentials.json
19
+ * └── {userId2}/
20
+ * └── ...
21
+ */
22
+ import * as fs from 'fs';
23
+ import * as path from 'path';
24
+ import { createLogger } from '@agent-relay/resiliency';
25
+ const logger = createLogger('user-directory');
26
+ const PROVIDER_CONFIGS = {
27
+ claude: {
28
+ dir: '.claude',
29
+ credentialsFile: '.credentials.json',
30
+ },
31
+ codex: {
32
+ dir: '.codex',
33
+ credentialsFile: 'credentials.json',
34
+ },
35
+ gemini: {
36
+ dir: '.config/gcloud',
37
+ credentialsFile: 'application_default_credentials.json',
38
+ },
39
+ opencode: {
40
+ dir: '.opencode',
41
+ credentialsFile: 'credentials.json',
42
+ },
43
+ droid: {
44
+ dir: '.factory',
45
+ credentialsFile: 'credentials.json',
46
+ },
47
+ cursor: {
48
+ dir: '.cursor',
49
+ credentialsFile: 'auth.json',
50
+ },
51
+ };
52
+ /**
53
+ * All supported providers for initialization
54
+ */
55
+ const ALL_PROVIDERS = Object.keys(PROVIDER_CONFIGS);
56
+ /**
57
+ * Service for managing per-user directories on workspace volumes.
58
+ * Enables multi-user credential storage without conflicts.
59
+ */
60
+ export class UserDirectoryService {
61
+ baseDir;
62
+ usersDir;
63
+ /**
64
+ * Create a new UserDirectoryService.
65
+ * @param baseDir - Base data directory (e.g., /data)
66
+ */
67
+ constructor(baseDir) {
68
+ this.baseDir = baseDir;
69
+ this.usersDir = path.join(baseDir, 'users');
70
+ // Ensure users directory exists
71
+ this.ensureDirectory(this.usersDir);
72
+ logger.info(`UserDirectoryService initialized at ${this.usersDir}`);
73
+ }
74
+ /**
75
+ * Get the home directory path for a user.
76
+ * Creates the directory if it doesn't exist.
77
+ *
78
+ * @param userId - User ID (UUID or similar)
79
+ * @returns Absolute path to user's home directory
80
+ * @throws Error if userId is invalid
81
+ */
82
+ getUserHome(userId) {
83
+ this.validateUserId(userId);
84
+ const userHome = path.join(this.usersDir, userId);
85
+ this.ensureDirectory(userHome);
86
+ return userHome;
87
+ }
88
+ /**
89
+ * Ensure a provider's credential directory exists for a user.
90
+ *
91
+ * @param userId - User ID
92
+ * @param provider - Provider name (claude, codex, gemini, etc.)
93
+ * @returns Absolute path to provider directory
94
+ */
95
+ ensureProviderDir(userId, provider) {
96
+ this.validateUserId(userId);
97
+ const config = PROVIDER_CONFIGS[provider];
98
+ if (!config) {
99
+ // For unknown providers, use .{provider} directory
100
+ const userHome = this.getUserHome(userId);
101
+ const providerDir = path.join(userHome, `.${provider}`);
102
+ this.ensureDirectory(providerDir);
103
+ return providerDir;
104
+ }
105
+ const userHome = this.getUserHome(userId);
106
+ const providerDir = path.join(userHome, config.dir);
107
+ this.ensureDirectory(providerDir);
108
+ return providerDir;
109
+ }
110
+ /**
111
+ * Initialize a complete user environment with all provider directories.
112
+ *
113
+ * @param userId - User ID
114
+ * @returns User's home directory path
115
+ */
116
+ initializeUserEnvironment(userId) {
117
+ this.validateUserId(userId);
118
+ const userHome = this.getUserHome(userId);
119
+ // Create all provider directories
120
+ for (const provider of ALL_PROVIDERS) {
121
+ this.ensureProviderDir(userId, provider);
122
+ }
123
+ logger.info(`Initialized user environment for ${userId} at ${userHome}`);
124
+ return userHome;
125
+ }
126
+ /**
127
+ * Get environment variables for spawning an agent with user-specific HOME.
128
+ *
129
+ * @param userId - User ID
130
+ * @returns Environment variables to merge with process.env
131
+ */
132
+ getUserEnvironment(userId) {
133
+ const userHome = this.getUserHome(userId);
134
+ return {
135
+ HOME: userHome,
136
+ XDG_CONFIG_HOME: path.join(userHome, '.config'),
137
+ AGENT_RELAY_USER_ID: userId,
138
+ };
139
+ }
140
+ /**
141
+ * List all user IDs that have directories.
142
+ *
143
+ * @returns Array of user IDs
144
+ */
145
+ listUsers() {
146
+ try {
147
+ const entries = fs.readdirSync(this.usersDir, { withFileTypes: true });
148
+ return entries
149
+ .filter((entry) => entry.isDirectory())
150
+ .map((entry) => entry.name);
151
+ }
152
+ catch {
153
+ return [];
154
+ }
155
+ }
156
+ /**
157
+ * Check if a user has an existing directory.
158
+ *
159
+ * @param userId - User ID
160
+ * @returns True if directory exists
161
+ */
162
+ hasUserDirectory(userId) {
163
+ const userHome = path.join(this.usersDir, userId);
164
+ return fs.existsSync(userHome);
165
+ }
166
+ /**
167
+ * Get the path to a provider's credentials file for a user.
168
+ *
169
+ * @param userId - User ID
170
+ * @param provider - Provider name
171
+ * @returns Absolute path to credentials file
172
+ */
173
+ getProviderCredentialPath(userId, provider) {
174
+ const config = PROVIDER_CONFIGS[provider];
175
+ if (!config) {
176
+ const userHome = this.getUserHome(userId);
177
+ return path.join(userHome, `.${provider}`, 'credentials.json');
178
+ }
179
+ const providerDir = this.ensureProviderDir(userId, provider);
180
+ return path.join(providerDir, config.credentialsFile);
181
+ }
182
+ /**
183
+ * Write an API key to the appropriate credential file for a provider.
184
+ * Handles provider-specific formats (e.g., Gemini uses .env format).
185
+ *
186
+ * @param userId - User ID
187
+ * @param provider - Provider name (gemini, google, etc.)
188
+ * @param apiKey - The API key to write
189
+ * @returns Path to the written credential file
190
+ */
191
+ writeApiKeyCredential(userId, provider, apiKey) {
192
+ this.validateUserId(userId);
193
+ const userHome = this.getUserHome(userId);
194
+ // Gemini CLI reads from ~/.gemini/.env with GEMINI_API_KEY
195
+ if (provider === 'gemini' || provider === 'google') {
196
+ const geminiDir = path.join(userHome, '.gemini');
197
+ this.ensureDirectory(geminiDir);
198
+ const envPath = path.join(geminiDir, '.env');
199
+ fs.writeFileSync(envPath, `GEMINI_API_KEY="${apiKey}"\n`, { mode: 0o600 });
200
+ logger.info(`Wrote Gemini API key for user ${userId} to ${envPath}`);
201
+ return envPath;
202
+ }
203
+ // For other providers, use JSON format in the standard credential path
204
+ const credPath = this.getProviderCredentialPath(userId, provider);
205
+ const credDir = path.dirname(credPath);
206
+ this.ensureDirectory(credDir);
207
+ const credData = { apiKey, createdAt: new Date().toISOString() };
208
+ fs.writeFileSync(credPath, JSON.stringify(credData, null, 2), { mode: 0o600 });
209
+ logger.info(`Wrote ${provider} API key for user ${userId} to ${credPath}`);
210
+ return credPath;
211
+ }
212
+ /**
213
+ * Validate a user ID to prevent path traversal and other issues.
214
+ *
215
+ * @param userId - User ID to validate
216
+ * @throws Error if userId is invalid
217
+ */
218
+ validateUserId(userId) {
219
+ if (!userId || userId.trim() === '') {
220
+ throw new Error('User ID cannot be empty');
221
+ }
222
+ // Prevent path traversal
223
+ if (userId.includes('..') || userId.includes('/') || userId.includes('\\')) {
224
+ throw new Error('User ID contains invalid characters');
225
+ }
226
+ // Ensure resolved path is within users directory
227
+ const resolved = path.resolve(this.usersDir, userId);
228
+ if (!resolved.startsWith(this.usersDir)) {
229
+ throw new Error('User ID would escape users directory');
230
+ }
231
+ }
232
+ /**
233
+ * Ensure a directory exists, creating it recursively if needed.
234
+ */
235
+ ensureDirectory(dirPath) {
236
+ if (!fs.existsSync(dirPath)) {
237
+ fs.mkdirSync(dirPath, { recursive: true });
238
+ }
239
+ }
240
+ }
241
+ /**
242
+ * Get the default data directory for user directories.
243
+ * Uses AGENT_RELAY_DATA_DIR if set, otherwise /data (for Fly.io volumes).
244
+ */
245
+ export function getDefaultDataDir() {
246
+ return process.env.AGENT_RELAY_DATA_DIR || '/data';
247
+ }
248
+ /**
249
+ * Singleton instance for the workspace.
250
+ */
251
+ let _instance = null;
252
+ /**
253
+ * Get the singleton UserDirectoryService instance.
254
+ */
255
+ export function getUserDirectoryService() {
256
+ if (!_instance) {
257
+ _instance = new UserDirectoryService(getDefaultDataDir());
258
+ }
259
+ return _instance;
260
+ }
261
+ /**
262
+ * Create a new UserDirectoryService for testing or custom paths.
263
+ */
264
+ export function createUserDirectoryService(baseDir) {
265
+ return new UserDirectoryService(baseDir);
266
+ }
267
+ //# sourceMappingURL=user-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-directory.js","sourceRoot":"","sources":["../src/user-directory.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@agent-relay/user-directory",
3
+ "version": "0.1.0",
4
+ "description": "User directory service for agent-relay (per-user credential storage)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "clean": "rm -rf dist",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "dependencies": {
25
+ "@agent-relay/resiliency": "^0.1.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^22.19.3",
29
+ "typescript": "^5.9.3",
30
+ "vitest": "^3.2.4"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ }
35
+ }