@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.
- package/dist/agent-config.d.ts +47 -0
- package/dist/agent-config.d.ts.map +1 -0
- package/dist/agent-config.js +119 -0
- package/dist/agent-config.js.map +1 -0
- package/dist/bridge-config.d.ts +52 -0
- package/dist/bridge-config.d.ts.map +1 -0
- package/dist/bridge-config.js +143 -0
- package/dist/bridge-config.js.map +1 -0
- package/dist/bridge-utils.d.ts +30 -0
- package/dist/bridge-utils.d.ts.map +1 -0
- package/dist/bridge-utils.js +54 -0
- package/dist/bridge-utils.js.map +1 -0
- package/dist/cli-auth-config.d.ts +110 -0
- package/dist/cli-auth-config.d.ts.map +1 -0
- package/dist/cli-auth-config.js +391 -0
- package/dist/cli-auth-config.js.map +1 -0
- package/dist/cloud-config.d.ts +75 -0
- package/dist/cloud-config.d.ts.map +1 -0
- package/dist/cloud-config.js +109 -0
- package/dist/cloud-config.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/project-namespace.d.ts +73 -0
- package/dist/project-namespace.d.ts.map +1 -0
- package/dist/project-namespace.js +280 -0
- package/dist/project-namespace.js.map +1 -0
- package/dist/relay-config.d.ts +25 -0
- package/dist/relay-config.d.ts.map +1 -0
- package/dist/relay-config.js +25 -0
- package/dist/relay-config.js.map +1 -0
- package/dist/relay-file-writer.d.ts +200 -0
- package/dist/relay-file-writer.d.ts.map +1 -0
- package/dist/relay-file-writer.js +407 -0
- package/dist/relay-file-writer.js.map +1 -0
- package/dist/schemas.d.ts +672 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +180 -0
- package/dist/schemas.js.map +1 -0
- package/dist/shadow-config.d.ts +87 -0
- package/dist/shadow-config.d.ts.map +1 -0
- package/dist/shadow-config.js +134 -0
- package/dist/shadow-config.js.map +1 -0
- package/dist/teams-config.d.ts +47 -0
- package/dist/teams-config.d.ts.map +1 -0
- package/dist/teams-config.js +100 -0
- package/dist/teams-config.js.map +1 -0
- package/dist/trajectory-config.d.ts +102 -0
- package/dist/trajectory-config.d.ts.map +1 -0
- package/dist/trajectory-config.js +185 -0
- package/dist/trajectory-config.js.map +1 -0
- 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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAezD,MAAM,YAAY,GAAG;IACnB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,aAAa,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC;CACjE,CAAC;AAUF;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3C,0BAA0B;IAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAkB,EAClB,WAAoB;IAEpB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,mCAAmC;IACnC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAEnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC;gBACtE,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAE3C,oCAAoC;YACpC,MAAM,aAAa,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC;YAE/E,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,KAAK,CAAC,SAAS;gBACnB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,QAAQ,EAAE,aAAa,EAAE,IAAI,IAAI,kBAAkB,CAAC,WAAW,CAAC;gBAChE,GAAG,EAAE,WAAW,IAAI,aAAa,EAAE,GAAG,IAAI,MAAM,EAAE,UAAU,IAAI,QAAQ;aACzE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,4BAA4B;SACvB,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAEnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC;gBACtE,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAE3C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,KAAK,CAAC,SAAS;gBACnB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,QAAQ,EAAE,aAAa,CAAC,IAAI,IAAI,kBAAkB,CAAC,WAAW,CAAC;gBAC/D,GAAG,EAAE,WAAW,IAAI,aAAa,CAAC,GAAG,IAAI,MAAM,CAAC,UAAU,IAAI,QAAQ;aACvE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAyB;IAIvD,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAyB;IAEzB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAExD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,gCAAgC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,SAAS,CAAC,OAAO,OAAO,CAAC,IAAI,uBAAuB,EAAE;gBAC1D,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,4BAA4B;YAC5B,MAAM,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,+BAA+B,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,SAAiB;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -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"}
|