@agent-relay/config 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/agent-config.d.ts +47 -0
  2. package/dist/agent-config.d.ts.map +1 -0
  3. package/dist/agent-config.js +119 -0
  4. package/dist/agent-config.js.map +1 -0
  5. package/dist/bridge-config.d.ts +52 -0
  6. package/dist/bridge-config.d.ts.map +1 -0
  7. package/dist/bridge-config.js +143 -0
  8. package/dist/bridge-config.js.map +1 -0
  9. package/dist/bridge-utils.d.ts +30 -0
  10. package/dist/bridge-utils.d.ts.map +1 -0
  11. package/dist/bridge-utils.js +54 -0
  12. package/dist/bridge-utils.js.map +1 -0
  13. package/dist/cli-auth-config.d.ts +110 -0
  14. package/dist/cli-auth-config.d.ts.map +1 -0
  15. package/dist/cli-auth-config.js +391 -0
  16. package/dist/cli-auth-config.js.map +1 -0
  17. package/dist/cloud-config.d.ts +75 -0
  18. package/dist/cloud-config.d.ts.map +1 -0
  19. package/dist/cloud-config.js +109 -0
  20. package/dist/cloud-config.js.map +1 -0
  21. package/dist/index.d.ts +13 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +13 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/project-namespace.d.ts +73 -0
  26. package/dist/project-namespace.d.ts.map +1 -0
  27. package/dist/project-namespace.js +280 -0
  28. package/dist/project-namespace.js.map +1 -0
  29. package/dist/relay-config.d.ts +25 -0
  30. package/dist/relay-config.d.ts.map +1 -0
  31. package/dist/relay-config.js +25 -0
  32. package/dist/relay-config.js.map +1 -0
  33. package/dist/relay-file-writer.d.ts +200 -0
  34. package/dist/relay-file-writer.d.ts.map +1 -0
  35. package/dist/relay-file-writer.js +407 -0
  36. package/dist/relay-file-writer.js.map +1 -0
  37. package/dist/schemas.d.ts +672 -0
  38. package/dist/schemas.d.ts.map +1 -0
  39. package/dist/schemas.js +180 -0
  40. package/dist/schemas.js.map +1 -0
  41. package/dist/shadow-config.d.ts +87 -0
  42. package/dist/shadow-config.d.ts.map +1 -0
  43. package/dist/shadow-config.js +134 -0
  44. package/dist/shadow-config.js.map +1 -0
  45. package/dist/teams-config.d.ts +47 -0
  46. package/dist/teams-config.d.ts.map +1 -0
  47. package/dist/teams-config.js +100 -0
  48. package/dist/teams-config.js.map +1 -0
  49. package/dist/trajectory-config.d.ts +102 -0
  50. package/dist/trajectory-config.d.ts.map +1 -0
  51. package/dist/trajectory-config.js +185 -0
  52. package/dist/trajectory-config.js.map +1 -0
  53. package/package.json +98 -0
@@ -0,0 +1,407 @@
1
+ /**
2
+ * Relay File Writer
3
+ *
4
+ * Provides a clean abstraction for writing relay messages and attachments
5
+ * to the file system with a structured directory layout.
6
+ *
7
+ * Directory structure (project-local):
8
+ * {projectRoot}/.agent-relay/
9
+ * outbox/{agent-name}/ # Agent outbox messages
10
+ * attachments/{agent-name}/{ts}/ # Attachments organized by timestamp
11
+ * meta/ # Configuration and state files
12
+ *
13
+ * For cloud workspaces with WORKSPACE_ID:
14
+ * /tmp/relay/{workspaceId}/
15
+ * outbox/{agent-name}/
16
+ * attachments/{agent-name}/{ts}/
17
+ *
18
+ * Agents should use $AGENT_RELAY_OUTBOX environment variable which is
19
+ * automatically set by the orchestrator to the correct path.
20
+ */
21
+ import fs from 'node:fs';
22
+ import path from 'node:path';
23
+ import os from 'node:os';
24
+ import crypto from 'node:crypto';
25
+ // ============================================================================
26
+ // Constants
27
+ // ============================================================================
28
+ const MAX_SOCKET_PATH_LENGTH = 107;
29
+ const DEFAULT_OUTBOX_DIR = 'outbox';
30
+ const DEFAULT_ATTACHMENTS_DIR = 'attachments';
31
+ const DEFAULT_META_DIR = 'meta';
32
+ const LEGACY_OUTBOX_BASE = '/tmp/relay-outbox';
33
+ // ============================================================================
34
+ // Path Resolution
35
+ // ============================================================================
36
+ /**
37
+ * Hash a workspace ID to keep paths short (for Unix socket length limits)
38
+ */
39
+ function hashWorkspaceId(workspaceId) {
40
+ return crypto.createHash('sha256').update(workspaceId).digest('hex').slice(0, 12);
41
+ }
42
+ /**
43
+ * Get the base directory for relay data.
44
+ * Priority:
45
+ * 1. AGENT_RELAY_DATA_DIR environment variable
46
+ * 2. XDG_DATA_HOME/agent-relay (Linux/macOS standard)
47
+ * 3. ~/.agent-relay (fallback)
48
+ */
49
+ function getBaseDir() {
50
+ // Explicit override
51
+ if (process.env.AGENT_RELAY_DATA_DIR) {
52
+ return process.env.AGENT_RELAY_DATA_DIR;
53
+ }
54
+ // XDG Base Directory Specification
55
+ const xdgDataHome = process.env.XDG_DATA_HOME;
56
+ if (xdgDataHome) {
57
+ return path.join(xdgDataHome, 'agent-relay');
58
+ }
59
+ // Default: ~/.agent-relay
60
+ return path.join(os.homedir(), '.agent-relay');
61
+ }
62
+ /**
63
+ * Get workspace-specific paths for cloud deployments.
64
+ * Uses /tmp/relay/{workspaceId} to ensure workspace isolation.
65
+ */
66
+ function getWorkspacePaths(workspaceId) {
67
+ let effectiveId = workspaceId;
68
+ let workspaceDir = `/tmp/relay/${workspaceId}`;
69
+ // Check if path would be too long for sockets
70
+ const testSocketPath = `${workspaceDir}/sockets/test.sock`;
71
+ if (testSocketPath.length > MAX_SOCKET_PATH_LENGTH) {
72
+ effectiveId = hashWorkspaceId(workspaceId);
73
+ workspaceDir = `/tmp/relay/${effectiveId}`;
74
+ }
75
+ return {
76
+ rootDir: workspaceDir,
77
+ outboxDir: path.join(workspaceDir, DEFAULT_OUTBOX_DIR),
78
+ attachmentsDir: path.join(workspaceDir, DEFAULT_ATTACHMENTS_DIR),
79
+ metaDir: path.join(workspaceDir, DEFAULT_META_DIR),
80
+ legacyOutboxDir: LEGACY_OUTBOX_BASE,
81
+ };
82
+ }
83
+ /**
84
+ * Get local (non-workspace) relay paths.
85
+ * Uses ~/.agent-relay for persistent storage.
86
+ */
87
+ function getLocalPaths() {
88
+ const baseDir = getBaseDir();
89
+ return {
90
+ rootDir: baseDir,
91
+ outboxDir: path.join(baseDir, DEFAULT_OUTBOX_DIR),
92
+ attachmentsDir: path.join(baseDir, DEFAULT_ATTACHMENTS_DIR),
93
+ metaDir: path.join(baseDir, DEFAULT_META_DIR),
94
+ legacyOutboxDir: LEGACY_OUTBOX_BASE,
95
+ };
96
+ }
97
+ // ============================================================================
98
+ // RelayFileWriter Class
99
+ // ============================================================================
100
+ /**
101
+ * Utility class for writing relay messages and attachments.
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * const writer = new RelayFileWriter('MyAgent');
106
+ *
107
+ * // Write a message
108
+ * await writer.writeMessage('msg', `TO: Lead\n\nACK: Task received`);
109
+ *
110
+ * // Write an attachment
111
+ * const result = await writer.writeAttachment('screenshot.png', imageBuffer);
112
+ * console.log(`Attachment saved to: ${result.path}`);
113
+ * ```
114
+ */
115
+ export class RelayFileWriter {
116
+ agentName;
117
+ paths;
118
+ workspaceId;
119
+ constructor(agentName, workspaceId) {
120
+ this.agentName = agentName;
121
+ this.workspaceId = workspaceId ?? process.env.WORKSPACE_ID;
122
+ // Resolve paths based on environment
123
+ const basePaths = this.workspaceId
124
+ ? getWorkspacePaths(this.workspaceId)
125
+ : getLocalPaths();
126
+ this.paths = {
127
+ ...basePaths,
128
+ agentOutbox: path.join(basePaths.outboxDir, agentName),
129
+ agentAttachments: path.join(basePaths.attachmentsDir, agentName),
130
+ isWorkspace: !!this.workspaceId,
131
+ agentName,
132
+ };
133
+ }
134
+ /**
135
+ * Get the resolved paths for this agent.
136
+ */
137
+ getPaths() {
138
+ return { ...this.paths };
139
+ }
140
+ /**
141
+ * Get the outbox path that agents should write to.
142
+ * Always returns the canonical ~/.agent-relay path.
143
+ * In workspace mode, this path is symlinked to the actual workspace path.
144
+ */
145
+ getOutboxPath() {
146
+ // Always use the canonical path - symlinks handle workspace routing
147
+ return this.paths.agentOutbox;
148
+ }
149
+ /**
150
+ * Get the legacy outbox path (for backwards compatibility symlinks).
151
+ */
152
+ getLegacyOutboxPath() {
153
+ return path.join(this.paths.legacyOutboxDir, this.agentName);
154
+ }
155
+ /**
156
+ * Ensure all necessary directories exist for this agent.
157
+ * In workspace mode, also sets up symlinks from canonical path to workspace path.
158
+ */
159
+ async ensureDirectories() {
160
+ // Create agent-specific directories at canonical path
161
+ await fs.promises.mkdir(this.paths.agentOutbox, { recursive: true });
162
+ await fs.promises.mkdir(this.paths.agentAttachments, { recursive: true });
163
+ await fs.promises.mkdir(this.paths.metaDir, { recursive: true });
164
+ // In workspace mode, set up symlinks so canonical path routes to workspace
165
+ // (Note: The orchestrator handles symlink setup, this is just for standalone use)
166
+ if (this.paths.isWorkspace) {
167
+ await this.setupWorkspaceSymlinks();
168
+ }
169
+ }
170
+ /**
171
+ * Set up symlinks for workspace mode.
172
+ * Creates symlink from legacy /tmp/relay-outbox path to workspace path.
173
+ * (The orchestrator creates the canonical→workspace symlink)
174
+ */
175
+ async setupWorkspaceSymlinks() {
176
+ const legacyPath = path.join(this.paths.legacyOutboxDir, this.agentName);
177
+ try {
178
+ await this.createSymlinkSafe(legacyPath, this.paths.agentOutbox);
179
+ }
180
+ catch (err) {
181
+ console.error(`[relay-file-writer] Failed to setup workspace symlinks: ${err.message}`);
182
+ }
183
+ }
184
+ /**
185
+ * Helper to create a symlink, cleaning up existing path first.
186
+ */
187
+ async createSymlinkSafe(linkPath, targetPath) {
188
+ const linkParent = path.dirname(linkPath);
189
+ await fs.promises.mkdir(linkParent, { recursive: true });
190
+ try {
191
+ const stats = await fs.promises.lstat(linkPath);
192
+ if (stats.isSymbolicLink()) {
193
+ const target = await fs.promises.readlink(linkPath);
194
+ if (target === targetPath) {
195
+ return; // Already correctly configured
196
+ }
197
+ await fs.promises.unlink(linkPath);
198
+ }
199
+ else if (stats.isDirectory()) {
200
+ await fs.promises.rm(linkPath, { recursive: true, force: true });
201
+ }
202
+ }
203
+ catch (err) {
204
+ if (err.code !== 'ENOENT') {
205
+ throw err;
206
+ }
207
+ // Path doesn't exist - proceed to create symlink
208
+ }
209
+ await fs.promises.symlink(targetPath, linkPath);
210
+ }
211
+ /**
212
+ * Write a message to the agent's outbox.
213
+ *
214
+ * @param messageType - Type/name of the message (e.g., 'msg', 'ack', 'done')
215
+ * @param content - Message content (headers + body)
216
+ * @param options - Write options
217
+ * @returns Full path to the written file
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * await writer.writeMessage('ack', `TO: Lead\n\nACK: Task received`);
222
+ * ```
223
+ */
224
+ async writeMessage(messageType, content, options = {}) {
225
+ const { mkdir = true, mode = 0o644 } = options;
226
+ if (mkdir) {
227
+ await this.ensureDirectories();
228
+ }
229
+ const filePath = path.join(this.paths.agentOutbox, messageType);
230
+ await fs.promises.writeFile(filePath, content, { mode });
231
+ return filePath;
232
+ }
233
+ /**
234
+ * Write an attachment to the agent's attachments directory.
235
+ * Attachments are organized by timestamp to prevent collisions.
236
+ *
237
+ * @param fileName - Name of the attachment file
238
+ * @param data - File content (string or Buffer)
239
+ * @param options - Write options
240
+ * @returns Attachment result with paths
241
+ *
242
+ * @example
243
+ * ```typescript
244
+ * const result = await writer.writeAttachment('screenshot.png', imageBuffer);
245
+ * console.log(`Saved to: ${result.path}`);
246
+ * ```
247
+ */
248
+ async writeAttachment(fileName, data, options = {}) {
249
+ const { mkdir = true, mode = 0o644 } = options;
250
+ // Create timestamp-based subdirectory
251
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
252
+ const attachmentDir = path.join(this.paths.agentAttachments, timestamp);
253
+ if (mkdir) {
254
+ await fs.promises.mkdir(attachmentDir, { recursive: true });
255
+ }
256
+ const filePath = path.join(attachmentDir, fileName);
257
+ await fs.promises.writeFile(filePath, data, { mode });
258
+ return {
259
+ path: filePath,
260
+ relativePath: path.join(this.agentName, timestamp, fileName),
261
+ timestamp,
262
+ };
263
+ }
264
+ /**
265
+ * Read a message from the agent's outbox.
266
+ *
267
+ * @param messageType - Type/name of the message
268
+ * @returns Message content or null if not found
269
+ */
270
+ async readMessage(messageType) {
271
+ const filePath = path.join(this.paths.agentOutbox, messageType);
272
+ try {
273
+ return await fs.promises.readFile(filePath, 'utf-8');
274
+ }
275
+ catch (err) {
276
+ if (err.code === 'ENOENT') {
277
+ return null;
278
+ }
279
+ throw err;
280
+ }
281
+ }
282
+ /**
283
+ * Delete a message from the agent's outbox.
284
+ *
285
+ * @param messageType - Type/name of the message
286
+ * @returns true if deleted, false if not found
287
+ */
288
+ async deleteMessage(messageType) {
289
+ const filePath = path.join(this.paths.agentOutbox, messageType);
290
+ try {
291
+ await fs.promises.unlink(filePath);
292
+ return true;
293
+ }
294
+ catch (err) {
295
+ if (err.code === 'ENOENT') {
296
+ return false;
297
+ }
298
+ throw err;
299
+ }
300
+ }
301
+ /**
302
+ * List all messages in the agent's outbox.
303
+ *
304
+ * @returns Array of message type names
305
+ */
306
+ async listMessages() {
307
+ try {
308
+ const entries = await fs.promises.readdir(this.paths.agentOutbox);
309
+ return entries.filter(e => !e.startsWith('.'));
310
+ }
311
+ catch (err) {
312
+ if (err.code === 'ENOENT') {
313
+ return [];
314
+ }
315
+ throw err;
316
+ }
317
+ }
318
+ /**
319
+ * Write metadata to the meta directory.
320
+ *
321
+ * @param key - Metadata key (file name)
322
+ * @param data - Metadata content (will be JSON stringified if object)
323
+ */
324
+ async writeMeta(key, data) {
325
+ await fs.promises.mkdir(this.paths.metaDir, { recursive: true });
326
+ const content = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
327
+ const filePath = path.join(this.paths.metaDir, key);
328
+ await fs.promises.writeFile(filePath, content);
329
+ return filePath;
330
+ }
331
+ async readMeta(key, parse = false) {
332
+ const filePath = path.join(this.paths.metaDir, key);
333
+ try {
334
+ const content = await fs.promises.readFile(filePath, 'utf-8');
335
+ return parse ? JSON.parse(content) : content;
336
+ }
337
+ catch (err) {
338
+ if (err.code === 'ENOENT') {
339
+ return null;
340
+ }
341
+ throw err;
342
+ }
343
+ }
344
+ /**
345
+ * Clean up the agent's outbox (remove all messages).
346
+ */
347
+ async cleanOutbox() {
348
+ try {
349
+ const entries = await fs.promises.readdir(this.paths.agentOutbox);
350
+ for (const entry of entries) {
351
+ await fs.promises.unlink(path.join(this.paths.agentOutbox, entry));
352
+ }
353
+ }
354
+ catch (err) {
355
+ if (err.code !== 'ENOENT') {
356
+ throw err;
357
+ }
358
+ }
359
+ }
360
+ }
361
+ // ============================================================================
362
+ // Static Utility Functions
363
+ // ============================================================================
364
+ /**
365
+ * Get relay paths for an agent (without creating an instance).
366
+ */
367
+ export function getRelayPaths(agentName, workspaceId) {
368
+ const writer = new RelayFileWriter(agentName, workspaceId);
369
+ return writer.getPaths();
370
+ }
371
+ /**
372
+ * Get the base relay paths (not agent-specific).
373
+ */
374
+ export function getBaseRelayPaths(workspaceId) {
375
+ const effectiveWorkspaceId = workspaceId ?? process.env.WORKSPACE_ID;
376
+ return effectiveWorkspaceId
377
+ ? getWorkspacePaths(effectiveWorkspaceId)
378
+ : getLocalPaths();
379
+ }
380
+ /**
381
+ * Get the outbox path that should be used in agent instructions.
382
+ * This is the path agents will write to in their bash commands.
383
+ *
384
+ * Returns the $AGENT_RELAY_OUTBOX environment variable by default.
385
+ * This env var is automatically set by the orchestrator when spawning agents,
386
+ * and contains the correct project-local path.
387
+ *
388
+ * @param _agentNameVar - Deprecated, kept for API compatibility
389
+ * @returns Path template for agent instructions
390
+ */
391
+ export function getAgentOutboxTemplate(_agentNameVar = '$AGENT_RELAY_NAME') {
392
+ // Agents should use $AGENT_RELAY_OUTBOX which is set by the orchestrator
393
+ // This handles both local (project-local .agent-relay/) and cloud (workspace) modes
394
+ return '$AGENT_RELAY_OUTBOX';
395
+ }
396
+ /**
397
+ * Ensure the base relay directories exist.
398
+ */
399
+ export async function ensureBaseDirectories(workspaceId) {
400
+ const paths = getBaseRelayPaths(workspaceId);
401
+ await fs.promises.mkdir(paths.outboxDir, { recursive: true });
402
+ await fs.promises.mkdir(paths.attachmentsDir, { recursive: true });
403
+ await fs.promises.mkdir(paths.metaDir, { recursive: true });
404
+ await fs.promises.mkdir(paths.legacyOutboxDir, { recursive: true });
405
+ return paths;
406
+ }
407
+ //# sourceMappingURL=relay-file-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-file-writer.js","sourceRoot":"","sources":["../src/relay-file-writer.ts"],"names":[],"mappings":"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"}