@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,47 @@
1
+ /**
2
+ * Agent Config Detection
3
+ *
4
+ * Detects agent configuration from .claude/agents/ or .openagents/ directories.
5
+ * Parses frontmatter to extract model, description, and other settings.
6
+ */
7
+ export interface AgentConfig {
8
+ /** Agent name (from filename or frontmatter) */
9
+ name: string;
10
+ /** Path to the config file */
11
+ configPath: string;
12
+ /** Model to use (e.g., 'haiku', 'sonnet', 'opus') */
13
+ model?: string;
14
+ /** Agent description */
15
+ description?: string;
16
+ /** Allowed tools */
17
+ allowedTools?: string[];
18
+ /** Agent type */
19
+ agentType?: string;
20
+ /** Agent role for prompt composition (planner, worker, reviewer, lead, shadow) */
21
+ role?: string;
22
+ }
23
+ /**
24
+ * Find and parse agent config for a given agent name.
25
+ * Searches in order:
26
+ * 1. .claude/agents/<name>.md (case-insensitive)
27
+ * 2. .openagents/<name>.md (case-insensitive)
28
+ *
29
+ * @param agentName The agent name to look up
30
+ * @param projectRoot The project root directory (defaults to cwd)
31
+ * @returns AgentConfig if found, null otherwise
32
+ */
33
+ export declare function findAgentConfig(agentName: string, projectRoot?: string): AgentConfig | null;
34
+ /**
35
+ * Check if a command is a Claude CLI command.
36
+ */
37
+ export declare function isClaudeCli(command: string): boolean;
38
+ /**
39
+ * Build Claude CLI arguments with auto-detected agent config.
40
+ *
41
+ * @param agentName Agent name
42
+ * @param existingArgs Existing command arguments
43
+ * @param projectRoot Project root directory
44
+ * @returns Modified args array with --model and --agent if applicable
45
+ */
46
+ export declare function buildClaudeArgs(agentName: string, existingArgs?: string[], projectRoot?: string): string[];
47
+ //# sourceMappingURL=agent-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-config.d.ts","sourceRoot":"","sources":["../src/agent-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqCD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA6C3F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,MAAM,EAAO,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,EAAE,CAoBV"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Agent Config Detection
3
+ *
4
+ * Detects agent configuration from .claude/agents/ or .openagents/ directories.
5
+ * Parses frontmatter to extract model, description, and other settings.
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ /**
10
+ * Parse YAML-style frontmatter from markdown content.
11
+ * Handles basic key: value pairs.
12
+ */
13
+ function parseFrontmatter(content) {
14
+ const result = {};
15
+ // Check for frontmatter delimiters
16
+ if (!content.startsWith('---')) {
17
+ return result;
18
+ }
19
+ const endIndex = content.indexOf('---', 3);
20
+ if (endIndex === -1) {
21
+ return result;
22
+ }
23
+ const frontmatter = content.slice(3, endIndex).trim();
24
+ const lines = frontmatter.split('\n');
25
+ for (const line of lines) {
26
+ const colonIndex = line.indexOf(':');
27
+ if (colonIndex === -1)
28
+ continue;
29
+ const key = line.slice(0, colonIndex).trim();
30
+ const value = line.slice(colonIndex + 1).trim();
31
+ if (key && value) {
32
+ result[key] = value;
33
+ }
34
+ }
35
+ return result;
36
+ }
37
+ /**
38
+ * Find and parse agent config for a given agent name.
39
+ * Searches in order:
40
+ * 1. .claude/agents/<name>.md (case-insensitive)
41
+ * 2. .openagents/<name>.md (case-insensitive)
42
+ *
43
+ * @param agentName The agent name to look up
44
+ * @param projectRoot The project root directory (defaults to cwd)
45
+ * @returns AgentConfig if found, null otherwise
46
+ */
47
+ export function findAgentConfig(agentName, projectRoot) {
48
+ const root = projectRoot ?? process.cwd();
49
+ const lowerName = agentName.toLowerCase();
50
+ // Directories to search
51
+ const searchDirs = [
52
+ path.join(root, '.claude', 'agents'),
53
+ path.join(root, '.openagents'),
54
+ ];
55
+ for (const dir of searchDirs) {
56
+ if (!fs.existsSync(dir)) {
57
+ continue;
58
+ }
59
+ try {
60
+ const files = fs.readdirSync(dir);
61
+ // Find matching file (case-insensitive)
62
+ for (const file of files) {
63
+ if (!file.endsWith('.md'))
64
+ continue;
65
+ const baseName = file.slice(0, -3); // Remove .md
66
+ if (baseName.toLowerCase() === lowerName) {
67
+ const configPath = path.join(dir, file);
68
+ const content = fs.readFileSync(configPath, 'utf-8');
69
+ const frontmatter = parseFrontmatter(content);
70
+ return {
71
+ name: frontmatter.name || baseName,
72
+ configPath,
73
+ model: frontmatter.model,
74
+ description: frontmatter.description,
75
+ allowedTools: frontmatter['allowed-tools']?.split(',').map(t => t.trim()),
76
+ agentType: frontmatter.agentType,
77
+ role: frontmatter.role,
78
+ };
79
+ }
80
+ }
81
+ }
82
+ catch {
83
+ // Directory read failed, continue to next
84
+ }
85
+ }
86
+ return null;
87
+ }
88
+ /**
89
+ * Check if a command is a Claude CLI command.
90
+ */
91
+ export function isClaudeCli(command) {
92
+ const cmd = command.toLowerCase();
93
+ return cmd === 'claude' || cmd.startsWith('claude ') || cmd.includes('/claude');
94
+ }
95
+ /**
96
+ * Build Claude CLI arguments with auto-detected agent config.
97
+ *
98
+ * @param agentName Agent name
99
+ * @param existingArgs Existing command arguments
100
+ * @param projectRoot Project root directory
101
+ * @returns Modified args array with --model and --agent if applicable
102
+ */
103
+ export function buildClaudeArgs(agentName, existingArgs = [], projectRoot) {
104
+ const config = findAgentConfig(agentName, projectRoot);
105
+ if (!config) {
106
+ return [...existingArgs]; // Return a copy to avoid reference issues
107
+ }
108
+ const newArgs = [...existingArgs];
109
+ // Add --model if specified in config and not already in args
110
+ if (config.model && !existingArgs.includes('--model')) {
111
+ newArgs.push('--model', config.model);
112
+ }
113
+ // Add --agent to load the agent's system prompt (if not already specified)
114
+ if (!existingArgs.includes('--agent')) {
115
+ newArgs.push('--agent', config.name);
116
+ }
117
+ return newArgs;
118
+ }
119
+ //# sourceMappingURL=agent-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-config.js","sourceRoot":"","sources":["../src/agent-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Bridge Configuration
3
+ * Handles loading and resolving bridge configuration from files and CLI args.
4
+ */
5
+ export interface ProjectConfig {
6
+ /** Absolute path to project root */
7
+ path: string;
8
+ /** Project identifier (derived from path hash) */
9
+ id: string;
10
+ /** Socket path for this project's daemon */
11
+ socketPath: string;
12
+ /** Lead agent name (auto-generated from dirname if not specified) */
13
+ leadName: string;
14
+ /** CLI tool to use (default: claude) */
15
+ cli: string;
16
+ }
17
+ interface BridgeConfigFile {
18
+ projects?: Record<string, {
19
+ lead?: string;
20
+ cli?: string;
21
+ }>;
22
+ defaultCli?: string;
23
+ }
24
+ /**
25
+ * Load bridge config from file
26
+ */
27
+ export declare function loadBridgeConfig(): BridgeConfigFile | null;
28
+ /**
29
+ * Resolve project path (expand ~ and make absolute)
30
+ */
31
+ export declare function resolvePath(p: string): string;
32
+ /**
33
+ * Get default lead name from directory name
34
+ */
35
+ export declare function getDefaultLeadName(projectPath: string): string;
36
+ /**
37
+ * Resolve projects from CLI args and/or config file
38
+ */
39
+ export declare function resolveProjects(cliPaths: string[], cliOverride?: string): ProjectConfig[];
40
+ /**
41
+ * Validate that daemons are running for all projects
42
+ */
43
+ export declare function validateDaemons(projects: ProjectConfig[]): {
44
+ valid: ProjectConfig[];
45
+ missing: ProjectConfig[];
46
+ };
47
+ /**
48
+ * Start daemons for missing projects
49
+ */
50
+ export declare function startMissingDaemons(projects: ProjectConfig[]): Promise<void>;
51
+ export {};
52
+ //# sourceMappingURL=bridge-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-config.d.ts","sourceRoot":"","sources":["../src/bridge-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;CACb;AAOD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,GAAG,IAAI,CAY1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,EAAE,CAmDjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG;IAC1D,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B,CAaA;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Bridge Configuration
3
+ * Handles loading and resolving bridge configuration from files and CLI args.
4
+ */
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import os from 'node:os';
8
+ import { getProjectPaths } from './project-namespace.js';
9
+ const CONFIG_PATHS = [
10
+ path.join(os.homedir(), '.agent-relay', 'bridge.json'),
11
+ path.join(os.homedir(), '.config', 'agent-relay', 'bridge.json'),
12
+ ];
13
+ /**
14
+ * Load bridge config from file
15
+ */
16
+ export function loadBridgeConfig() {
17
+ for (const configPath of CONFIG_PATHS) {
18
+ if (fs.existsSync(configPath)) {
19
+ try {
20
+ const content = fs.readFileSync(configPath, 'utf-8');
21
+ return JSON.parse(content);
22
+ }
23
+ catch (err) {
24
+ console.error(`[bridge] Failed to parse ${configPath}:`, err);
25
+ }
26
+ }
27
+ }
28
+ return null;
29
+ }
30
+ /**
31
+ * Resolve project path (expand ~ and make absolute)
32
+ */
33
+ export function resolvePath(p) {
34
+ if (p.startsWith('~')) {
35
+ p = path.join(os.homedir(), p.slice(1));
36
+ }
37
+ return path.resolve(p);
38
+ }
39
+ /**
40
+ * Get default lead name from directory name
41
+ */
42
+ export function getDefaultLeadName(projectPath) {
43
+ const dirname = path.basename(projectPath);
44
+ // Capitalize first letter
45
+ return dirname.charAt(0).toUpperCase() + dirname.slice(1);
46
+ }
47
+ /**
48
+ * Resolve projects from CLI args and/or config file
49
+ */
50
+ export function resolveProjects(cliPaths, cliOverride) {
51
+ const config = loadBridgeConfig();
52
+ const projects = [];
53
+ // If CLI paths provided, use those
54
+ if (cliPaths.length > 0) {
55
+ for (const p of cliPaths) {
56
+ const projectPath = resolvePath(p);
57
+ if (!fs.existsSync(projectPath)) {
58
+ console.error(`[bridge] Project path does not exist: ${projectPath}`);
59
+ continue;
60
+ }
61
+ const paths = getProjectPaths(projectPath);
62
+ // Check for project-specific config
63
+ const projectConfig = config?.projects?.[p] || config?.projects?.[projectPath];
64
+ projects.push({
65
+ path: projectPath,
66
+ id: paths.projectId,
67
+ socketPath: paths.socketPath,
68
+ leadName: projectConfig?.lead || getDefaultLeadName(projectPath),
69
+ cli: cliOverride || projectConfig?.cli || config?.defaultCli || 'claude',
70
+ });
71
+ }
72
+ }
73
+ // Otherwise use config file
74
+ else if (config?.projects) {
75
+ for (const [p, projectConfig] of Object.entries(config.projects)) {
76
+ const projectPath = resolvePath(p);
77
+ if (!fs.existsSync(projectPath)) {
78
+ console.error(`[bridge] Project path does not exist: ${projectPath}`);
79
+ continue;
80
+ }
81
+ const paths = getProjectPaths(projectPath);
82
+ projects.push({
83
+ path: projectPath,
84
+ id: paths.projectId,
85
+ socketPath: paths.socketPath,
86
+ leadName: projectConfig.lead || getDefaultLeadName(projectPath),
87
+ cli: cliOverride || projectConfig.cli || config.defaultCli || 'claude',
88
+ });
89
+ }
90
+ }
91
+ return projects;
92
+ }
93
+ /**
94
+ * Validate that daemons are running for all projects
95
+ */
96
+ export function validateDaemons(projects) {
97
+ const valid = [];
98
+ const missing = [];
99
+ for (const project of projects) {
100
+ if (fs.existsSync(project.socketPath)) {
101
+ valid.push(project);
102
+ }
103
+ else {
104
+ missing.push(project);
105
+ }
106
+ }
107
+ return { valid, missing };
108
+ }
109
+ /**
110
+ * Start daemons for missing projects
111
+ */
112
+ export async function startMissingDaemons(projects) {
113
+ const { execAsync } = await import('./bridge-utils.js');
114
+ for (const project of projects) {
115
+ console.log(`[bridge] Starting daemon for ${project.id}...`);
116
+ try {
117
+ // Start daemon in background
118
+ await execAsync(`cd "${project.path}" && agent-relay up &`, {
119
+ timeout: 5000,
120
+ });
121
+ // Wait for socket to appear
122
+ await waitForSocket(project.socketPath, 10000);
123
+ console.log(`[bridge] Daemon started for ${project.id}`);
124
+ }
125
+ catch (err) {
126
+ console.error(`[bridge] Failed to start daemon for ${project.id}:`, err);
127
+ }
128
+ }
129
+ }
130
+ /**
131
+ * Wait for socket file to exist
132
+ */
133
+ async function waitForSocket(socketPath, timeoutMs) {
134
+ const startTime = Date.now();
135
+ while (Date.now() - startTime < timeoutMs) {
136
+ if (fs.existsSync(socketPath)) {
137
+ return;
138
+ }
139
+ await new Promise(r => setTimeout(r, 200));
140
+ }
141
+ throw new Error(`Timeout waiting for socket: ${socketPath}`);
142
+ }
143
+ //# sourceMappingURL=bridge-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-config.js","sourceRoot":"","sources":["../src/bridge-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Bridge Utilities
3
+ */
4
+ import { exec } from 'node:child_process';
5
+ export declare const execAsync: typeof exec.__promisify__;
6
+ /**
7
+ * Sleep for a given number of milliseconds
8
+ */
9
+ export declare function sleep(ms: number): Promise<void>;
10
+ /**
11
+ * Parse a cross-project message target
12
+ * Formats:
13
+ * "project:agent" -> { projectId: "project", agentName: "agent" }
14
+ * "*:agent" -> { projectId: "*", agentName: "agent" } (all projects)
15
+ * "project:*" -> { projectId: "project", agentName: "*" } (broadcast in project)
16
+ * "*:*" -> { projectId: "*", agentName: "*" } (broadcast everywhere)
17
+ */
18
+ export declare function parseTarget(target: string): {
19
+ projectId: string;
20
+ agentName: string;
21
+ } | null;
22
+ /**
23
+ * Escape string for shell
24
+ */
25
+ export declare function escapeForShell(str: string): string;
26
+ /**
27
+ * Escape string for tmux send-keys
28
+ */
29
+ export declare function escapeForTmux(str: string): string;
30
+ //# sourceMappingURL=bridge-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-utils.d.ts","sourceRoot":"","sources":["../src/bridge-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C,eAAO,MAAM,SAAS,2BAAkB,CAAC;AAEzC;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS3F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQjD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Bridge Utilities
3
+ */
4
+ import { exec } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ export const execAsync = promisify(exec);
7
+ /**
8
+ * Sleep for a given number of milliseconds
9
+ */
10
+ export function sleep(ms) {
11
+ return new Promise(resolve => setTimeout(resolve, ms));
12
+ }
13
+ /**
14
+ * Parse a cross-project message target
15
+ * Formats:
16
+ * "project:agent" -> { projectId: "project", agentName: "agent" }
17
+ * "*:agent" -> { projectId: "*", agentName: "agent" } (all projects)
18
+ * "project:*" -> { projectId: "project", agentName: "*" } (broadcast in project)
19
+ * "*:*" -> { projectId: "*", agentName: "*" } (broadcast everywhere)
20
+ */
21
+ export function parseTarget(target) {
22
+ const parts = target.split(':');
23
+ if (parts.length !== 2) {
24
+ return null;
25
+ }
26
+ return {
27
+ projectId: parts[0],
28
+ agentName: parts[1],
29
+ };
30
+ }
31
+ /**
32
+ * Escape string for shell
33
+ */
34
+ export function escapeForShell(str) {
35
+ return str
36
+ .replace(/\\/g, '\\\\')
37
+ .replace(/"/g, '\\"')
38
+ .replace(/\$/g, '\\$')
39
+ .replace(/`/g, '\\`')
40
+ .replace(/!/g, '\\!');
41
+ }
42
+ /**
43
+ * Escape string for tmux send-keys
44
+ */
45
+ export function escapeForTmux(str) {
46
+ return str
47
+ .replace(/[\r\n]+/g, ' ')
48
+ .replace(/\\/g, '\\\\')
49
+ .replace(/"/g, '\\"')
50
+ .replace(/\$/g, '\\$')
51
+ .replace(/`/g, '\\`')
52
+ .replace(/!/g, '\\!');
53
+ }
54
+ //# sourceMappingURL=bridge-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-utils.js","sourceRoot":"","sources":["../src/bridge-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACnB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;KACpB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,GAAG;SACP,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Shared CLI Auth Configuration
3
+ *
4
+ * Provider-specific CLI commands and patterns for OAuth authentication.
5
+ * Used by both the cloud API and workspace daemon.
6
+ */
7
+ /**
8
+ * Interactive prompt handler configuration
9
+ * Defines patterns to detect prompts and responses to send
10
+ */
11
+ export interface PromptHandler {
12
+ /** Pattern to detect in CLI output (case-insensitive) */
13
+ pattern: RegExp;
14
+ /** Response to send (e.g., '\r' for enter, 'y\r' for yes+enter) */
15
+ response: string;
16
+ /** Delay before sending response (ms) */
17
+ delay?: number;
18
+ /** Description for logging/debugging */
19
+ description: string;
20
+ }
21
+ /**
22
+ * Error pattern configuration for detecting auth failures
23
+ */
24
+ export interface ErrorPattern {
25
+ /** Pattern to detect in CLI output */
26
+ pattern: RegExp;
27
+ /** User-friendly error message */
28
+ message: string;
29
+ /** Whether this error is recoverable by retrying */
30
+ recoverable: boolean;
31
+ /** Optional hint for the user */
32
+ hint?: string;
33
+ }
34
+ /**
35
+ * CLI auth configuration for each provider
36
+ */
37
+ export interface CLIAuthConfig {
38
+ /** CLI command to run */
39
+ command: string;
40
+ /** Arguments to pass */
41
+ args: string[];
42
+ /** Alternative args for device flow (if supported) */
43
+ deviceFlowArgs?: string[];
44
+ /** Pattern to extract auth URL from output */
45
+ urlPattern: RegExp;
46
+ /** Path to credentials file (for reading after auth) */
47
+ credentialPath?: string;
48
+ /** Display name for UI */
49
+ displayName: string;
50
+ /** Interactive prompts to auto-respond to */
51
+ prompts: PromptHandler[];
52
+ /** Success indicators in output */
53
+ successPatterns: RegExp[];
54
+ /** Error patterns to detect auth failures */
55
+ errorPatterns?: ErrorPattern[];
56
+ /** How long to wait for URL to appear (ms) */
57
+ waitTimeout: number;
58
+ /** Whether this provider supports device flow */
59
+ supportsDeviceFlow?: boolean;
60
+ }
61
+ /**
62
+ * CLI commands and URL patterns for each provider
63
+ *
64
+ * Each CLI tool outputs an OAuth URL when run without credentials.
65
+ * We capture stdout/stderr and extract the URL using regex patterns.
66
+ *
67
+ * IMPORTANT: These CLIs are interactive - they output the auth URL then wait
68
+ * for the user to complete OAuth in their browser. We capture the URL and
69
+ * display it in a popup for the user.
70
+ */
71
+ export declare const CLI_AUTH_CONFIG: Record<string, CLIAuthConfig>;
72
+ /**
73
+ * Strip ANSI escape codes from text
74
+ */
75
+ export declare function stripAnsiCodes(text: string): string;
76
+ /**
77
+ * Check if text matches any success pattern
78
+ */
79
+ export declare function matchesSuccessPattern(text: string, patterns: RegExp[]): boolean;
80
+ /**
81
+ * Find matching prompt handler that hasn't been responded to yet
82
+ */
83
+ export declare function findMatchingPrompt(text: string, prompts: PromptHandler[], respondedPrompts: Set<string>): PromptHandler | null;
84
+ /**
85
+ * Check if text matches any error pattern and return the matched error
86
+ */
87
+ export declare function findMatchingError(text: string, errorPatterns?: ErrorPattern[]): ErrorPattern | null;
88
+ /**
89
+ * Get list of supported provider IDs
90
+ */
91
+ export declare function getSupportedProviderIds(): string[];
92
+ /**
93
+ * Get list of supported providers with details
94
+ */
95
+ export declare function getSupportedProviders(): {
96
+ id: string;
97
+ displayName: string;
98
+ command: string;
99
+ }[];
100
+ /**
101
+ * Validate a provider's CLI auth configuration
102
+ * Returns null if valid, or an error message if invalid
103
+ */
104
+ export declare function validateProviderConfig(providerId: string, config: CLIAuthConfig): string | null;
105
+ /**
106
+ * Validate all provider configurations
107
+ * Returns array of error messages (empty if all valid)
108
+ */
109
+ export declare function validateAllProviderConfigs(): string[];
110
+ //# sourceMappingURL=cli-auth-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-auth-config.d.ts","sourceRoot":"","sources":["../src/cli-auth-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,WAAW,EAAE,OAAO,CAAC;IACrB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,mCAAmC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAuPzD,CAAC;AAEF;;GAEG;AAEH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAGD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAG/E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EAAE,EACxB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC5B,aAAa,GAAG,IAAI,CAStB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,YAAY,EAAE,GAC7B,YAAY,GAAG,IAAI,CASrB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAElD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAM9F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,GACpB,MAAM,GAAG,IAAI,CAkDf;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CASrD"}