@emaxe/agento 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/LICENSE +21 -0
- package/README.md +304 -0
- package/dist/bin/agento.d.ts +3 -0
- package/dist/bin/agento.d.ts.map +1 -0
- package/dist/bin/agento.js +44 -0
- package/dist/bin/agento.js.map +1 -0
- package/dist/src/adapters/base.d.ts +38 -0
- package/dist/src/adapters/base.d.ts.map +1 -0
- package/dist/src/adapters/base.js +2 -0
- package/dist/src/adapters/base.js.map +1 -0
- package/dist/src/adapters/claude-code.d.ts +13 -0
- package/dist/src/adapters/claude-code.d.ts.map +1 -0
- package/dist/src/adapters/claude-code.js +70 -0
- package/dist/src/adapters/claude-code.js.map +1 -0
- package/dist/src/adapters/codex.d.ts +15 -0
- package/dist/src/adapters/codex.d.ts.map +1 -0
- package/dist/src/adapters/codex.js +148 -0
- package/dist/src/adapters/codex.js.map +1 -0
- package/dist/src/adapters/opencode.d.ts +13 -0
- package/dist/src/adapters/opencode.d.ts.map +1 -0
- package/dist/src/adapters/opencode.js +62 -0
- package/dist/src/adapters/opencode.js.map +1 -0
- package/dist/src/adapters/qwen.d.ts +13 -0
- package/dist/src/adapters/qwen.d.ts.map +1 -0
- package/dist/src/adapters/qwen.js +84 -0
- package/dist/src/adapters/qwen.js.map +1 -0
- package/dist/src/cli/commands/agent.d.ts +3 -0
- package/dist/src/cli/commands/agent.d.ts.map +1 -0
- package/dist/src/cli/commands/agent.js +42 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/launch.d.ts +3 -0
- package/dist/src/cli/commands/launch.d.ts.map +1 -0
- package/dist/src/cli/commands/launch.js +80 -0
- package/dist/src/cli/commands/launch.js.map +1 -0
- package/dist/src/cli/commands/profile.d.ts +3 -0
- package/dist/src/cli/commands/profile.d.ts.map +1 -0
- package/dist/src/cli/commands/profile.js +102 -0
- package/dist/src/cli/commands/profile.js.map +1 -0
- package/dist/src/cli/commands/provider.d.ts +3 -0
- package/dist/src/cli/commands/provider.d.ts.map +1 -0
- package/dist/src/cli/commands/provider.js +70 -0
- package/dist/src/cli/commands/provider.js.map +1 -0
- package/dist/src/cli/commands/restore.d.ts +3 -0
- package/dist/src/cli/commands/restore.d.ts.map +1 -0
- package/dist/src/cli/commands/restore.js +41 -0
- package/dist/src/cli/commands/restore.js.map +1 -0
- package/dist/src/config/schema.d.ts +218 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +49 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/config/store.d.ts +20 -0
- package/dist/src/config/store.d.ts.map +1 -0
- package/dist/src/config/store.js +59 -0
- package/dist/src/config/store.js.map +1 -0
- package/dist/src/launcher/child.d.ts +30 -0
- package/dist/src/launcher/child.d.ts.map +1 -0
- package/dist/src/launcher/child.js +115 -0
- package/dist/src/launcher/child.js.map +1 -0
- package/dist/src/launcher/independent.d.ts +25 -0
- package/dist/src/launcher/independent.d.ts.map +1 -0
- package/dist/src/launcher/independent.js +26 -0
- package/dist/src/launcher/independent.js.map +1 -0
- package/dist/src/launcher/shell-path-resolver.d.ts +17 -0
- package/dist/src/launcher/shell-path-resolver.d.ts.map +1 -0
- package/dist/src/launcher/shell-path-resolver.js +97 -0
- package/dist/src/launcher/shell-path-resolver.js.map +1 -0
- package/dist/src/profiles/profile-manager.d.ts +17 -0
- package/dist/src/profiles/profile-manager.d.ts.map +1 -0
- package/dist/src/profiles/profile-manager.js +74 -0
- package/dist/src/profiles/profile-manager.js.map +1 -0
- package/dist/src/providers/provider-manager.d.ts +13 -0
- package/dist/src/providers/provider-manager.d.ts.map +1 -0
- package/dist/src/providers/provider-manager.js +42 -0
- package/dist/src/providers/provider-manager.js.map +1 -0
- package/dist/src/tui/App.d.ts +10 -0
- package/dist/src/tui/App.d.ts.map +1 -0
- package/dist/src/tui/App.js +43 -0
- package/dist/src/tui/App.js.map +1 -0
- package/dist/src/tui/screens/Agents.d.ts +8 -0
- package/dist/src/tui/screens/Agents.d.ts.map +1 -0
- package/dist/src/tui/screens/Agents.js +70 -0
- package/dist/src/tui/screens/Agents.js.map +1 -0
- package/dist/src/tui/screens/LaunchAgent.d.ts +10 -0
- package/dist/src/tui/screens/LaunchAgent.d.ts.map +1 -0
- package/dist/src/tui/screens/LaunchAgent.js +119 -0
- package/dist/src/tui/screens/LaunchAgent.js.map +1 -0
- package/dist/src/tui/screens/MainMenu.d.ts +9 -0
- package/dist/src/tui/screens/MainMenu.d.ts.map +1 -0
- package/dist/src/tui/screens/MainMenu.js +32 -0
- package/dist/src/tui/screens/MainMenu.js.map +1 -0
- package/dist/src/tui/screens/Profiles.d.ts +7 -0
- package/dist/src/tui/screens/Profiles.d.ts.map +1 -0
- package/dist/src/tui/screens/Profiles.js +528 -0
- package/dist/src/tui/screens/Profiles.js.map +1 -0
- package/dist/src/tui/screens/Providers.d.ts +7 -0
- package/dist/src/tui/screens/Providers.d.ts.map +1 -0
- package/dist/src/tui/screens/Providers.js +235 -0
- package/dist/src/tui/screens/Providers.js.map +1 -0
- package/dist/src/tui/screens/Settings.d.ts +7 -0
- package/dist/src/tui/screens/Settings.d.ts.map +1 -0
- package/dist/src/tui/screens/Settings.js +49 -0
- package/dist/src/tui/screens/Settings.js.map +1 -0
- package/dist/src/tui/start.d.ts +6 -0
- package/dist/src/tui/start.d.ts.map +1 -0
- package/dist/src/tui/start.js +15 -0
- package/dist/src/tui/start.js.map +1 -0
- package/dist/src/tui/use-key-input.d.ts +9 -0
- package/dist/src/tui/use-key-input.d.ts.map +1 -0
- package/dist/src/tui/use-key-input.js +19 -0
- package/dist/src/tui/use-key-input.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { unlink } from 'node:fs/promises';
|
|
3
|
+
import { writeBackup, readBackup, deleteBackup } from '../config/store.js';
|
|
4
|
+
import { shellPathResolver } from './shell-path-resolver.js';
|
|
5
|
+
/**
|
|
6
|
+
* Готовит конфиг для запуска агента из TUI (child mode).
|
|
7
|
+
* Делает backup и записывает новый конфиг, но не запускает процесс.
|
|
8
|
+
* Возвращает ExecRequest и cleanup-функцию для последующего вызова из agento.ts.
|
|
9
|
+
*/
|
|
10
|
+
export async function prepareChild(options) {
|
|
11
|
+
const { adapter, profile, providers, scope, command, args = [], cwd } = options;
|
|
12
|
+
// 1. Backup текущего конфига агента
|
|
13
|
+
const currentConfig = await adapter.readConfig(scope, cwd);
|
|
14
|
+
const hadConfig = currentConfig !== null;
|
|
15
|
+
await writeBackup(adapter.id, scope, currentConfig ?? {});
|
|
16
|
+
// 2. Генерируем и записываем новый конфиг
|
|
17
|
+
const newConfig = adapter.buildConfig(profile, providers);
|
|
18
|
+
await adapter.writeConfig(newConfig, scope, cwd);
|
|
19
|
+
// 3. Резолвим PATH чтобы найти исполняемый файл агента
|
|
20
|
+
const resolvedPath = await shellPathResolver.resolve();
|
|
21
|
+
const cleanEnv = Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] !== undefined));
|
|
22
|
+
const adapterEnv = adapter.buildEnv?.(profile, providers) ?? {};
|
|
23
|
+
// 4. Cleanup-функция: восстанавливает оригинальный конфиг или удаляет файл
|
|
24
|
+
const cleanup = async () => {
|
|
25
|
+
if (!hadConfig) {
|
|
26
|
+
const configPath = adapter.configPaths(cwd)[scope];
|
|
27
|
+
try {
|
|
28
|
+
await unlink(configPath);
|
|
29
|
+
}
|
|
30
|
+
catch { /* file might not exist */ }
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const backup = await readBackup(adapter.id, scope);
|
|
34
|
+
if (backup !== null) {
|
|
35
|
+
await adapter.writeConfig(backup, scope, cwd);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
await deleteBackup(adapter.id, scope);
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
execReq: { command, args, env: { ...cleanEnv, PATH: resolvedPath, ...adapterEnv } },
|
|
42
|
+
cleanup,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Запускает агент как дочерний процесс.
|
|
47
|
+
* Перед запуском: backup → patch config.
|
|
48
|
+
* После завершения: restore config.
|
|
49
|
+
* SIGTERM/SIGINT: cleanup-хук восстанавливает конфиг.
|
|
50
|
+
*/
|
|
51
|
+
export async function launchChild(options) {
|
|
52
|
+
const { adapter, profile, providers, scope, command, args = [], cwd } = options;
|
|
53
|
+
// 1. Backup текущего конфига агента
|
|
54
|
+
const currentConfig = await adapter.readConfig(scope, cwd);
|
|
55
|
+
const hadConfig = currentConfig !== null;
|
|
56
|
+
await writeBackup(adapter.id, scope, currentConfig ?? {});
|
|
57
|
+
// 2. Генерируем и записываем новый конфиг
|
|
58
|
+
const newConfig = adapter.buildConfig(profile, providers);
|
|
59
|
+
await adapter.writeConfig(newConfig, scope, cwd);
|
|
60
|
+
// 3. Cleanup-функция: восстанавливает оригинальный конфиг или удаляет файл
|
|
61
|
+
const cleanup = async () => {
|
|
62
|
+
if (!hadConfig) {
|
|
63
|
+
const configPath = adapter.configPaths(cwd)[scope];
|
|
64
|
+
try {
|
|
65
|
+
await unlink(configPath);
|
|
66
|
+
}
|
|
67
|
+
catch { /* file might not exist */ }
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const backup = await readBackup(adapter.id, scope);
|
|
71
|
+
if (backup !== null) {
|
|
72
|
+
await adapter.writeConfig(backup, scope, cwd);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
await deleteBackup(adapter.id, scope);
|
|
76
|
+
};
|
|
77
|
+
// 4. Запускаем дочерний процесс
|
|
78
|
+
const cleanEnv = Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] !== undefined));
|
|
79
|
+
const resolvedPath = await shellPathResolver.resolve();
|
|
80
|
+
const adapterEnv = adapter.buildEnv?.(profile, providers) ?? {};
|
|
81
|
+
const spawnEnv = { ...cleanEnv, PATH: resolvedPath, ...adapterEnv };
|
|
82
|
+
return new Promise((resolve) => {
|
|
83
|
+
const child = spawn(command, args, {
|
|
84
|
+
stdio: 'inherit',
|
|
85
|
+
cwd: cwd ?? process.cwd(),
|
|
86
|
+
shell: false,
|
|
87
|
+
env: spawnEnv,
|
|
88
|
+
});
|
|
89
|
+
// 5. Регистрируем SIGTERM/SIGINT хуки — пробрасываем сигнал дочернему процессу
|
|
90
|
+
const handleSignal = (signal) => {
|
|
91
|
+
child.kill(signal);
|
|
92
|
+
cleanup().catch(console.error).finally(() => process.exit(1));
|
|
93
|
+
};
|
|
94
|
+
process.once('SIGTERM', handleSignal);
|
|
95
|
+
process.once('SIGINT', handleSignal);
|
|
96
|
+
child.on('exit', (code) => {
|
|
97
|
+
process.removeListener('SIGTERM', handleSignal);
|
|
98
|
+
process.removeListener('SIGINT', handleSignal);
|
|
99
|
+
cleanup()
|
|
100
|
+
.catch(console.error)
|
|
101
|
+
.finally(() => resolve(code ?? 0));
|
|
102
|
+
});
|
|
103
|
+
child.on('error', (err) => {
|
|
104
|
+
process.removeListener('SIGTERM', handleSignal);
|
|
105
|
+
process.removeListener('SIGINT', handleSignal);
|
|
106
|
+
cleanup()
|
|
107
|
+
.catch(console.error)
|
|
108
|
+
.finally(() => {
|
|
109
|
+
console.error(`Failed to launch ${command}:`, err.message);
|
|
110
|
+
resolve(1);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child.js","sourceRoot":"","sources":["../../../src/launcher/child.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AgentAdapter, LaunchScope } from '../adapters/base.js';
|
|
2
|
+
import type { Profile, Provider } from '../config/schema.js';
|
|
3
|
+
export interface ExecRequest {
|
|
4
|
+
command: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
env: Record<string, string>;
|
|
7
|
+
relaunch?: boolean;
|
|
8
|
+
cleanup?: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export interface IndependentLaunchOptions {
|
|
11
|
+
adapter: AgentAdapter;
|
|
12
|
+
profile: Profile;
|
|
13
|
+
providers: Provider[];
|
|
14
|
+
scope: LaunchScope;
|
|
15
|
+
command: string;
|
|
16
|
+
args?: string[];
|
|
17
|
+
cwd?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Готовит конфиг для независимого запуска агента.
|
|
21
|
+
* Записывает backup текущего конфига, генерирует и сохраняет новый,
|
|
22
|
+
* резолвит PATH и возвращает ExecRequest для запуска в терминале.
|
|
23
|
+
*/
|
|
24
|
+
export declare function launchIndependent(options: IndependentLaunchOptions): Promise<ExecRequest>;
|
|
25
|
+
//# sourceMappingURL=independent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"independent.d.ts","sourceRoot":"","sources":["../../../src/launcher/independent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAI7D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyB/F"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { writeBackup } from '../config/store.js';
|
|
2
|
+
import { shellPathResolver } from './shell-path-resolver.js';
|
|
3
|
+
/**
|
|
4
|
+
* Готовит конфиг для независимого запуска агента.
|
|
5
|
+
* Записывает backup текущего конфига, генерирует и сохраняет новый,
|
|
6
|
+
* резолвит PATH и возвращает ExecRequest для запуска в терминале.
|
|
7
|
+
*/
|
|
8
|
+
export async function launchIndependent(options) {
|
|
9
|
+
const { adapter, profile, providers, scope, command, args = [], cwd } = options;
|
|
10
|
+
// 1. Backup текущего конфига агента
|
|
11
|
+
const currentConfig = await adapter.readConfig(scope, cwd);
|
|
12
|
+
await writeBackup(adapter.id, scope, currentConfig ?? {});
|
|
13
|
+
// 2. Генерируем и записываем новый конфиг
|
|
14
|
+
const newConfig = adapter.buildConfig(profile, providers);
|
|
15
|
+
await adapter.writeConfig(newConfig, scope, cwd);
|
|
16
|
+
// 3. Резолвим PATH чтобы найти исполняемый файл агента
|
|
17
|
+
const resolvedPath = await shellPathResolver.resolve();
|
|
18
|
+
const cleanEnv = Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] !== undefined));
|
|
19
|
+
const adapterEnv = adapter.buildEnv?.(profile, providers) ?? {};
|
|
20
|
+
return {
|
|
21
|
+
command,
|
|
22
|
+
args,
|
|
23
|
+
env: { ...cleanEnv, PATH: resolvedPath, ...adapterEnv },
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=independent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"independent.js","sourceRoot":"","sources":["../../../src/launcher/independent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAoB7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAiC;IACvE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAEhF,oCAAoC;IACpC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IAE1D,0CAA0C;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAEjD,uDAAuD;IACvD,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CACjG,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;IAEhE,OAAO;QACL,OAAO;QACP,IAAI;QACJ,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,UAAU,EAAE;KACxD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Резолвит настоящий пользовательский PATH через login-shell.
|
|
3
|
+
* Кэширует результат. Используется при запуске агентов в independent-режиме.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ShellPathResolver {
|
|
6
|
+
private _resolvedPath;
|
|
7
|
+
private _promise;
|
|
8
|
+
resolve(): Promise<string>;
|
|
9
|
+
getResolvedPath(): string | null;
|
|
10
|
+
invalidate(): void;
|
|
11
|
+
private _doResolve;
|
|
12
|
+
private _mergeWithSystemPath;
|
|
13
|
+
private _buildFallbackPath;
|
|
14
|
+
}
|
|
15
|
+
/** Singleton instance for reuse across the application */
|
|
16
|
+
export declare const shellPathResolver: ShellPathResolver;
|
|
17
|
+
//# sourceMappingURL=shell-path-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-path-resolver.d.ts","sourceRoot":"","sources":["../../../src/launcher/shell-path-resolver.ts"],"names":[],"mappings":"AA8BA;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAgC;IAE1C,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAahC,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,UAAU,IAAI,IAAI;YAKJ,UAAU;IA6BxB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,kBAAkB;CAM3B;AAED,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
const FALLBACK_PATHS = [
|
|
4
|
+
'/opt/homebrew/bin',
|
|
5
|
+
'/usr/local/bin',
|
|
6
|
+
'/usr/bin',
|
|
7
|
+
'/bin',
|
|
8
|
+
'/usr/sbin',
|
|
9
|
+
'/sbin',
|
|
10
|
+
`${homedir()}/.cargo/bin`,
|
|
11
|
+
`${homedir()}/.local/bin`,
|
|
12
|
+
];
|
|
13
|
+
const SHELL = '/bin/zsh';
|
|
14
|
+
const TIMEOUT_MS = 3000;
|
|
15
|
+
const DELIMITER = '_SHELL_PATH_DELIMITER_';
|
|
16
|
+
function execShell(shell, args, timeout) {
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
execFile(shell, args, { timeout, env: process.env }, (err, stdout) => {
|
|
19
|
+
if (err) {
|
|
20
|
+
reject(err);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
resolve(stdout);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Резолвит настоящий пользовательский PATH через login-shell.
|
|
30
|
+
* Кэширует результат. Используется при запуске агентов в independent-режиме.
|
|
31
|
+
*/
|
|
32
|
+
export class ShellPathResolver {
|
|
33
|
+
_resolvedPath = null;
|
|
34
|
+
_promise = null;
|
|
35
|
+
async resolve() {
|
|
36
|
+
if (this._resolvedPath !== null) {
|
|
37
|
+
return this._resolvedPath;
|
|
38
|
+
}
|
|
39
|
+
if (this._promise !== null) {
|
|
40
|
+
return this._promise;
|
|
41
|
+
}
|
|
42
|
+
this._promise = this._doResolve();
|
|
43
|
+
this._resolvedPath = await this._promise;
|
|
44
|
+
this._promise = null;
|
|
45
|
+
return this._resolvedPath;
|
|
46
|
+
}
|
|
47
|
+
getResolvedPath() {
|
|
48
|
+
return this._resolvedPath;
|
|
49
|
+
}
|
|
50
|
+
invalidate() {
|
|
51
|
+
this._resolvedPath = null;
|
|
52
|
+
this._promise = null;
|
|
53
|
+
}
|
|
54
|
+
async _doResolve() {
|
|
55
|
+
const delimiter = `${DELIMITER}_${Date.now()}_${Math.random().toString(36).slice(2)}_`;
|
|
56
|
+
const script = `printf '%s%s%s' '${delimiter}' "\${PATH}" '${delimiter}'`;
|
|
57
|
+
try {
|
|
58
|
+
const stdout = await execShell(SHELL, ['-l', '-i', '-c', script], TIMEOUT_MS);
|
|
59
|
+
// Remove OSC escape sequences that macOS zsh may emit
|
|
60
|
+
const raw = (stdout || '').replace(/\x1b\][0-9]*;[^\x07]*\x07/g, '');
|
|
61
|
+
const start = raw.indexOf(delimiter);
|
|
62
|
+
const end = raw.indexOf(delimiter, start + delimiter.length);
|
|
63
|
+
let resolved;
|
|
64
|
+
if (start !== -1 && end !== -1 && end > start) {
|
|
65
|
+
resolved = raw.slice(start + delimiter.length, end);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
resolved = raw.trim();
|
|
69
|
+
}
|
|
70
|
+
if (resolved) {
|
|
71
|
+
return this._mergeWithSystemPath(resolved);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Fall through to fallback
|
|
76
|
+
}
|
|
77
|
+
return this._buildFallbackPath();
|
|
78
|
+
}
|
|
79
|
+
_mergeWithSystemPath(resolved) {
|
|
80
|
+
const system = (process.env.PATH || '/usr/bin:/bin:/usr/sbin:/sbin')
|
|
81
|
+
.split(':')
|
|
82
|
+
.filter(Boolean);
|
|
83
|
+
const cleaned = (resolved || '').replace(new RegExp(`_?${DELIMITER}[^:]*`, 'g'), '');
|
|
84
|
+
const user = cleaned.split(':').filter(Boolean);
|
|
85
|
+
const merged = [...new Set([...user, ...system])];
|
|
86
|
+
return merged.join(':');
|
|
87
|
+
}
|
|
88
|
+
_buildFallbackPath() {
|
|
89
|
+
const base = process.env.PATH || '/usr/bin:/bin:/usr/sbin:/sbin';
|
|
90
|
+
const parts = [...base.split(':'), ...FALLBACK_PATHS];
|
|
91
|
+
const resolved = [...new Set(parts)].filter(Boolean).join(':');
|
|
92
|
+
return this._mergeWithSystemPath(resolved);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Singleton instance for reuse across the application */
|
|
96
|
+
export const shellPathResolver = new ShellPathResolver();
|
|
97
|
+
//# sourceMappingURL=shell-path-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-path-resolver.js","sourceRoot":"","sources":["../../../src/launcher/shell-path-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Profile } from '../config/schema.js';
|
|
2
|
+
export type CreateProfileInput = Omit<Profile, 'id'>;
|
|
3
|
+
/** Возвращает список всех профилей. */
|
|
4
|
+
export declare function listProfiles(): Promise<Profile[]>;
|
|
5
|
+
/** Добавляет новый профиль. Возвращает созданный профиль. */
|
|
6
|
+
export declare function addProfile(input: CreateProfileInput): Promise<Profile>;
|
|
7
|
+
/** Обновляет профиль по id. Выбрасывает Error если не найден. */
|
|
8
|
+
export declare function updateProfile(id: string, updates: Partial<CreateProfileInput>): Promise<Profile>;
|
|
9
|
+
/** Удаляет профиль по id или имени. Выбрасывает Error если не найден. */
|
|
10
|
+
export declare function removeProfile(idOrName: string): Promise<void>;
|
|
11
|
+
/** Находит профиль по id или имени. Возвращает undefined если не найден. */
|
|
12
|
+
export declare function findProfile(idOrName: string): Promise<Profile | undefined>;
|
|
13
|
+
/** Перемещает модель в профиле вверх (уменьшает индекс). */
|
|
14
|
+
export declare function moveModelUp(profileId: string, modelIndex: number): Promise<Profile>;
|
|
15
|
+
/** Перемещает модель в профиле вниз (увеличивает индекс). */
|
|
16
|
+
export declare function moveModelDown(profileId: string, modelIndex: number): Promise<Profile>;
|
|
17
|
+
//# sourceMappingURL=profile-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-manager.d.ts","sourceRoot":"","sources":["../../../src/profiles/profile-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,OAAO,EAAqB,MAAM,qBAAqB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAErD,uCAAuC;AACvC,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAGvD;AAED,6DAA6D;AAC7D,wBAAsB,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAM5E;AAED,iEAAiE;AACjE,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED,yEAAyE;AACzE,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnE;AAED,4EAA4E;AAC5E,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAGhF;AAED,4DAA4D;AAC5D,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYzF;AAED,6DAA6D;AAC7D,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAY3F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { readConfig, writeConfig } from '../config/store.js';
|
|
3
|
+
import { ProfileSchema } from '../config/schema.js';
|
|
4
|
+
/** Возвращает список всех профилей. */
|
|
5
|
+
export async function listProfiles() {
|
|
6
|
+
const config = await readConfig();
|
|
7
|
+
return config.profiles;
|
|
8
|
+
}
|
|
9
|
+
/** Добавляет новый профиль. Возвращает созданный профиль. */
|
|
10
|
+
export async function addProfile(input) {
|
|
11
|
+
const config = await readConfig();
|
|
12
|
+
const profile = ProfileSchema.parse({ ...input, id: randomUUID() });
|
|
13
|
+
config.profiles.push(profile);
|
|
14
|
+
await writeConfig(config);
|
|
15
|
+
return profile;
|
|
16
|
+
}
|
|
17
|
+
/** Обновляет профиль по id. Выбрасывает Error если не найден. */
|
|
18
|
+
export async function updateProfile(id, updates) {
|
|
19
|
+
const config = await readConfig();
|
|
20
|
+
const index = config.profiles.findIndex((p) => p.id === id);
|
|
21
|
+
if (index === -1)
|
|
22
|
+
throw new Error(`Profile not found: ${id}`);
|
|
23
|
+
const updated = ProfileSchema.parse({ ...config.profiles[index], ...updates });
|
|
24
|
+
config.profiles[index] = updated;
|
|
25
|
+
await writeConfig(config);
|
|
26
|
+
return updated;
|
|
27
|
+
}
|
|
28
|
+
/** Удаляет профиль по id или имени. Выбрасывает Error если не найден. */
|
|
29
|
+
export async function removeProfile(idOrName) {
|
|
30
|
+
const config = await readConfig();
|
|
31
|
+
const index = config.profiles.findIndex((p) => p.id === idOrName || p.name === idOrName);
|
|
32
|
+
if (index === -1)
|
|
33
|
+
throw new Error(`Profile not found: ${idOrName}`);
|
|
34
|
+
config.profiles.splice(index, 1);
|
|
35
|
+
await writeConfig(config);
|
|
36
|
+
}
|
|
37
|
+
/** Находит профиль по id или имени. Возвращает undefined если не найден. */
|
|
38
|
+
export async function findProfile(idOrName) {
|
|
39
|
+
const config = await readConfig();
|
|
40
|
+
return config.profiles.find((p) => p.id === idOrName || p.name === idOrName);
|
|
41
|
+
}
|
|
42
|
+
/** Перемещает модель в профиле вверх (уменьшает индекс). */
|
|
43
|
+
export async function moveModelUp(profileId, modelIndex) {
|
|
44
|
+
const config = await readConfig();
|
|
45
|
+
const profile = config.profiles.find((p) => p.id === profileId);
|
|
46
|
+
if (!profile)
|
|
47
|
+
throw new Error(`Profile not found: ${profileId}`);
|
|
48
|
+
if (modelIndex <= 0 || modelIndex >= profile.models.length)
|
|
49
|
+
return profile;
|
|
50
|
+
const models = [...profile.models];
|
|
51
|
+
[models[modelIndex - 1], models[modelIndex]] = [models[modelIndex], models[modelIndex - 1]];
|
|
52
|
+
const updated = ProfileSchema.parse({ ...profile, models });
|
|
53
|
+
const index = config.profiles.findIndex((p) => p.id === profileId);
|
|
54
|
+
config.profiles[index] = updated;
|
|
55
|
+
await writeConfig(config);
|
|
56
|
+
return updated;
|
|
57
|
+
}
|
|
58
|
+
/** Перемещает модель в профиле вниз (увеличивает индекс). */
|
|
59
|
+
export async function moveModelDown(profileId, modelIndex) {
|
|
60
|
+
const config = await readConfig();
|
|
61
|
+
const profile = config.profiles.find((p) => p.id === profileId);
|
|
62
|
+
if (!profile)
|
|
63
|
+
throw new Error(`Profile not found: ${profileId}`);
|
|
64
|
+
if (modelIndex < 0 || modelIndex >= profile.models.length - 1)
|
|
65
|
+
return profile;
|
|
66
|
+
const models = [...profile.models];
|
|
67
|
+
[models[modelIndex], models[modelIndex + 1]] = [models[modelIndex + 1], models[modelIndex]];
|
|
68
|
+
const updated = ProfileSchema.parse({ ...profile, models });
|
|
69
|
+
const index = config.profiles.findIndex((p) => p.id === profileId);
|
|
70
|
+
config.profiles[index] = updated;
|
|
71
|
+
await writeConfig(config);
|
|
72
|
+
return updated;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=profile-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-manager.js","sourceRoot":"","sources":["../../../src/profiles/profile-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Provider } from '../config/schema.js';
|
|
2
|
+
export type CreateProviderInput = Omit<Provider, 'id'>;
|
|
3
|
+
/** Возвращает список всех провайдеров. */
|
|
4
|
+
export declare function listProviders(): Promise<Provider[]>;
|
|
5
|
+
/** Добавляет нового провайдера. Возвращает созданного провайдера. */
|
|
6
|
+
export declare function addProvider(input: CreateProviderInput): Promise<Provider>;
|
|
7
|
+
/** Обновляет провайдера по id. Выбрасывает Error если не найден. */
|
|
8
|
+
export declare function updateProvider(id: string, updates: Partial<CreateProviderInput>): Promise<Provider>;
|
|
9
|
+
/** Удаляет провайдера по id или имени. Выбрасывает Error если не найден. */
|
|
10
|
+
export declare function removeProvider(idOrName: string): Promise<void>;
|
|
11
|
+
/** Находит провайдера по id или имени. Возвращает undefined если не найден. */
|
|
12
|
+
export declare function findProvider(idOrName: string): Promise<Provider | undefined>;
|
|
13
|
+
//# sourceMappingURL=provider-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-manager.d.ts","sourceRoot":"","sources":["../../../src/providers/provider-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAEvD,0CAA0C;AAC1C,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAGzD;AAED,qEAAqE;AACrE,wBAAsB,WAAW,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAM/E;AAED,oEAAoE;AACpE,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,QAAQ,CAAC,CAQnB;AAED,4EAA4E;AAC5E,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpE;AAED,+EAA+E;AAC/E,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAGlF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { readConfig, writeConfig } from '../config/store.js';
|
|
3
|
+
import { ProviderSchema } from '../config/schema.js';
|
|
4
|
+
/** Возвращает список всех провайдеров. */
|
|
5
|
+
export async function listProviders() {
|
|
6
|
+
const config = await readConfig();
|
|
7
|
+
return config.providers;
|
|
8
|
+
}
|
|
9
|
+
/** Добавляет нового провайдера. Возвращает созданного провайдера. */
|
|
10
|
+
export async function addProvider(input) {
|
|
11
|
+
const config = await readConfig();
|
|
12
|
+
const provider = ProviderSchema.parse({ ...input, id: randomUUID() });
|
|
13
|
+
config.providers.push(provider);
|
|
14
|
+
await writeConfig(config);
|
|
15
|
+
return provider;
|
|
16
|
+
}
|
|
17
|
+
/** Обновляет провайдера по id. Выбрасывает Error если не найден. */
|
|
18
|
+
export async function updateProvider(id, updates) {
|
|
19
|
+
const config = await readConfig();
|
|
20
|
+
const index = config.providers.findIndex((p) => p.id === id);
|
|
21
|
+
if (index === -1)
|
|
22
|
+
throw new Error(`Provider not found: ${id}`);
|
|
23
|
+
const updated = ProviderSchema.parse({ ...config.providers[index], ...updates });
|
|
24
|
+
config.providers[index] = updated;
|
|
25
|
+
await writeConfig(config);
|
|
26
|
+
return updated;
|
|
27
|
+
}
|
|
28
|
+
/** Удаляет провайдера по id или имени. Выбрасывает Error если не найден. */
|
|
29
|
+
export async function removeProvider(idOrName) {
|
|
30
|
+
const config = await readConfig();
|
|
31
|
+
const index = config.providers.findIndex((p) => p.id === idOrName || p.name === idOrName);
|
|
32
|
+
if (index === -1)
|
|
33
|
+
throw new Error(`Provider not found: ${idOrName}`);
|
|
34
|
+
config.providers.splice(index, 1);
|
|
35
|
+
await writeConfig(config);
|
|
36
|
+
}
|
|
37
|
+
/** Находит провайдера по id или имени. Возвращает undefined если не найден. */
|
|
38
|
+
export async function findProvider(idOrName) {
|
|
39
|
+
const config = await readConfig();
|
|
40
|
+
return config.providers.find((p) => p.id === idOrName || p.name === idOrName);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=provider-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-manager.js","sourceRoot":"","sources":["../../../src/providers/provider-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAiB,MAAM,qBAAqB,CAAC;AAIpE,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,SAAS,CAAC;AAC1B,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAA0B;IAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAU,EACV,OAAqC;IAErC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACjF,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IAClC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAChD,CAAC;IACF,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ExecRequest } from '../launcher/independent.js';
|
|
3
|
+
export type Screen = 'main' | 'launch' | 'providers' | 'profiles' | 'agents' | 'settings';
|
|
4
|
+
interface AppProps {
|
|
5
|
+
dev?: boolean;
|
|
6
|
+
onExec?: (req: ExecRequest) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function App({ dev, onExec }: AppProps): React.JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=App.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/tui/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE1F,UAAU,QAAQ;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CACrC;AAED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0ChE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { useApp } from 'ink';
|
|
4
|
+
import { MainMenu } from './screens/MainMenu.js';
|
|
5
|
+
import { LaunchAgent } from './screens/LaunchAgent.js';
|
|
6
|
+
import { Providers } from './screens/Providers.js';
|
|
7
|
+
import { Profiles } from './screens/Profiles.js';
|
|
8
|
+
import { Agents } from './screens/Agents.js';
|
|
9
|
+
import { Settings } from './screens/Settings.js';
|
|
10
|
+
export function App({ dev, onExec }) {
|
|
11
|
+
const [screen, setScreen] = useState('main');
|
|
12
|
+
const { exit } = useApp();
|
|
13
|
+
const navigate = (target) => {
|
|
14
|
+
setScreen(target);
|
|
15
|
+
};
|
|
16
|
+
const goBack = () => {
|
|
17
|
+
setScreen('main');
|
|
18
|
+
};
|
|
19
|
+
const handleExec = (req) => {
|
|
20
|
+
onExec?.(req);
|
|
21
|
+
exit();
|
|
22
|
+
};
|
|
23
|
+
if (screen === 'main') {
|
|
24
|
+
return _jsx(MainMenu, { onSelect: navigate, onExit: exit });
|
|
25
|
+
}
|
|
26
|
+
if (screen === 'launch') {
|
|
27
|
+
return _jsx(LaunchAgent, { dev: dev, onBack: goBack, onExec: handleExec });
|
|
28
|
+
}
|
|
29
|
+
if (screen === 'providers') {
|
|
30
|
+
return _jsx(Providers, { onBack: goBack });
|
|
31
|
+
}
|
|
32
|
+
if (screen === 'profiles') {
|
|
33
|
+
return _jsx(Profiles, { onBack: goBack });
|
|
34
|
+
}
|
|
35
|
+
if (screen === 'agents') {
|
|
36
|
+
return _jsx(Agents, { dev: dev, onBack: goBack });
|
|
37
|
+
}
|
|
38
|
+
if (screen === 'settings') {
|
|
39
|
+
return _jsx(Settings, { onBack: goBack });
|
|
40
|
+
}
|
|
41
|
+
return _jsx(MainMenu, { onSelect: navigate, onExit: exit });
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/tui/App.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAUjD,MAAM,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAY;IAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAS,MAAM,CAAC,CAAC;IACrD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAQ,EAAE;QACxC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,SAAS,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAgB,EAAQ,EAAE;QAC5C,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QACd,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;IAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,KAAC,QAAQ,IAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAI,CAAC;IACxD,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,KAAC,WAAW,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAI,CAAC;IACvE,CAAC;IAED,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,KAAC,SAAS,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;IACvC,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,KAAC,QAAQ,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;IACtC,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,KAAC,MAAM,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAI,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,KAAC,QAAQ,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;IACtC,CAAC;IAED,OAAO,KAAC,QAAQ,IAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAI,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Agents.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/Agents.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AA0BhE,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkEtE"}
|