@emaxe/agento 0.3.0 → 0.4.1
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/AGENTS.md +28 -0
- package/CHANGELOG.md +33 -1
- package/README.md +28 -18
- package/README.ru.md +28 -18
- package/dist/bin/agento.js +34 -5
- package/dist/bin/agento.js.map +1 -1
- package/dist/src/adapters/copilot.d.ts +15 -0
- package/dist/src/adapters/copilot.d.ts.map +1 -0
- package/dist/src/adapters/copilot.js +71 -0
- package/dist/src/adapters/copilot.js.map +1 -0
- package/dist/src/adapters/opencode.d.ts +1 -0
- package/dist/src/adapters/opencode.d.ts.map +1 -1
- package/dist/src/adapters/opencode.js +10 -0
- package/dist/src/adapters/opencode.js.map +1 -1
- package/dist/src/cli/commands/agent.d.ts +7 -0
- package/dist/src/cli/commands/agent.d.ts.map +1 -1
- package/dist/src/cli/commands/agent.js +10 -1
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/launch.d.ts +7 -0
- package/dist/src/cli/commands/launch.d.ts.map +1 -1
- package/dist/src/cli/commands/launch.js +16 -5
- package/dist/src/cli/commands/launch.js.map +1 -1
- package/dist/src/cli/commands/profile.d.ts +6 -0
- package/dist/src/cli/commands/profile.d.ts.map +1 -1
- package/dist/src/cli/commands/profile.js +6 -0
- package/dist/src/cli/commands/profile.js.map +1 -1
- package/dist/src/cli/commands/provider.d.ts +6 -0
- package/dist/src/cli/commands/provider.d.ts.map +1 -1
- package/dist/src/cli/commands/provider.js +6 -0
- package/dist/src/cli/commands/provider.js.map +1 -1
- package/dist/src/cli/commands/restore.d.ts +8 -0
- package/dist/src/cli/commands/restore.d.ts.map +1 -1
- package/dist/src/cli/commands/restore.js +8 -0
- package/dist/src/cli/commands/restore.js.map +1 -1
- package/dist/src/config/schema.d.ts +1 -1
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +1 -1
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/store.d.ts +4 -0
- package/dist/src/config/store.d.ts.map +1 -1
- package/dist/src/config/store.js +18 -0
- package/dist/src/config/store.js.map +1 -1
- package/dist/src/installers/base.d.ts +25 -0
- package/dist/src/installers/base.d.ts.map +1 -0
- package/dist/src/installers/base.js +2 -0
- package/dist/src/installers/base.js.map +1 -0
- package/dist/src/installers/claude-code.d.ts +19 -0
- package/dist/src/installers/claude-code.d.ts.map +1 -0
- package/dist/src/installers/claude-code.js +55 -0
- package/dist/src/installers/claude-code.js.map +1 -0
- package/dist/src/installers/codex.d.ts +19 -0
- package/dist/src/installers/codex.d.ts.map +1 -0
- package/dist/src/installers/codex.js +55 -0
- package/dist/src/installers/codex.js.map +1 -0
- package/dist/src/installers/copilot.d.ts +19 -0
- package/dist/src/installers/copilot.d.ts.map +1 -0
- package/dist/src/installers/copilot.js +55 -0
- package/dist/src/installers/copilot.js.map +1 -0
- package/dist/src/installers/opencode.d.ts +19 -0
- package/dist/src/installers/opencode.d.ts.map +1 -0
- package/dist/src/installers/opencode.js +55 -0
- package/dist/src/installers/opencode.js.map +1 -0
- package/dist/src/installers/qwen.d.ts +19 -0
- package/dist/src/installers/qwen.d.ts.map +1 -0
- package/dist/src/installers/qwen.js +55 -0
- package/dist/src/installers/qwen.js.map +1 -0
- package/dist/src/installers/registry.d.ts +11 -0
- package/dist/src/installers/registry.d.ts.map +1 -0
- package/dist/src/installers/registry.js +18 -0
- package/dist/src/installers/registry.js.map +1 -0
- package/dist/src/launcher/child.js +1 -1
- package/dist/src/launcher/child.js.map +1 -1
- package/dist/src/launcher/independent.d.ts +16 -3
- package/dist/src/launcher/independent.d.ts.map +1 -1
- package/dist/src/launcher/independent.js +12 -3
- package/dist/src/launcher/independent.js.map +1 -1
- package/dist/src/profiles/profile-manager.d.ts +26 -7
- package/dist/src/profiles/profile-manager.d.ts.map +1 -1
- package/dist/src/profiles/profile-manager.js +26 -7
- package/dist/src/profiles/profile-manager.js.map +1 -1
- package/dist/src/providers/provider-manager.d.ts +18 -5
- package/dist/src/providers/provider-manager.d.ts.map +1 -1
- package/dist/src/providers/provider-manager.js +25 -5
- package/dist/src/providers/provider-manager.js.map +1 -1
- package/dist/src/tui/App.d.ts +12 -1
- package/dist/src/tui/App.d.ts.map +1 -1
- package/dist/src/tui/App.js +6 -2
- package/dist/src/tui/App.js.map +1 -1
- package/dist/src/tui/screens/AgentInstall.d.ts +10 -0
- package/dist/src/tui/screens/AgentInstall.d.ts.map +1 -0
- package/dist/src/tui/screens/AgentInstall.js +157 -0
- package/dist/src/tui/screens/AgentInstall.js.map +1 -0
- package/dist/src/tui/screens/Agents.d.ts +1 -0
- package/dist/src/tui/screens/Agents.d.ts.map +1 -1
- package/dist/src/tui/screens/Agents.js +4 -1
- package/dist/src/tui/screens/Agents.js.map +1 -1
- package/dist/src/tui/screens/LaunchAgent.d.ts +14 -1
- package/dist/src/tui/screens/LaunchAgent.d.ts.map +1 -1
- package/dist/src/tui/screens/LaunchAgent.js +138 -5
- package/dist/src/tui/screens/LaunchAgent.js.map +1 -1
- package/dist/src/tui/screens/MainMenu.d.ts +7 -0
- package/dist/src/tui/screens/MainMenu.d.ts.map +1 -1
- package/dist/src/tui/screens/MainMenu.js +7 -0
- package/dist/src/tui/screens/MainMenu.js.map +1 -1
- package/dist/src/tui/screens/Profiles.d.ts +1 -0
- package/dist/src/tui/screens/Profiles.d.ts.map +1 -1
- package/dist/src/tui/screens/Profiles.js +1 -0
- package/dist/src/tui/screens/Profiles.js.map +1 -1
- package/dist/src/tui/screens/Providers.d.ts +1 -0
- package/dist/src/tui/screens/Providers.d.ts.map +1 -1
- package/dist/src/tui/screens/Providers.js +1 -0
- package/dist/src/tui/screens/Providers.js.map +1 -1
- package/dist/src/tui/screens/Settings.d.ts +1 -0
- package/dist/src/tui/screens/Settings.d.ts.map +1 -1
- package/dist/src/tui/screens/Settings.js +20 -3
- package/dist/src/tui/screens/Settings.js.map +1 -1
- package/dist/src/tui/start.d.ts +9 -0
- package/dist/src/tui/start.d.ts.map +1 -1
- package/dist/src/tui/start.js +15 -0
- package/dist/src/tui/start.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level CRUD operations for API providers.
|
|
3
|
+
*
|
|
4
|
+
* All functions read and write the central `~/.agento/config.json` via
|
|
5
|
+
* {@link readConfig} / {@link writeConfig} so that every change is persisted
|
|
6
|
+
* immediately.
|
|
7
|
+
*/
|
|
1
8
|
import { randomUUID } from 'node:crypto';
|
|
2
9
|
import { readConfig, writeConfig } from '../config/store.js';
|
|
3
10
|
import { ProviderSchema } from '../config/schema.js';
|
|
4
|
-
/**
|
|
11
|
+
/** Returns all configured providers. */
|
|
5
12
|
export async function listProviders() {
|
|
6
13
|
const config = await readConfig();
|
|
7
14
|
return config.providers;
|
|
8
15
|
}
|
|
9
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Adds a new provider after validating the input against {@link ProviderSchema}.
|
|
18
|
+
* Generates a UUID for the provider id.
|
|
19
|
+
* @returns The newly created provider.
|
|
20
|
+
*/
|
|
10
21
|
export async function addProvider(input) {
|
|
11
22
|
const config = await readConfig();
|
|
12
23
|
const provider = ProviderSchema.parse({ ...input, id: randomUUID() });
|
|
@@ -14,7 +25,10 @@ export async function addProvider(input) {
|
|
|
14
25
|
await writeConfig(config);
|
|
15
26
|
return provider;
|
|
16
27
|
}
|
|
17
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Updates an existing provider by id.
|
|
30
|
+
* @throws Error if the provider is not found.
|
|
31
|
+
*/
|
|
18
32
|
export async function updateProvider(id, updates) {
|
|
19
33
|
const config = await readConfig();
|
|
20
34
|
const index = config.providers.findIndex((p) => p.id === id);
|
|
@@ -25,7 +39,10 @@ export async function updateProvider(id, updates) {
|
|
|
25
39
|
await writeConfig(config);
|
|
26
40
|
return updated;
|
|
27
41
|
}
|
|
28
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Removes a provider by id or name.
|
|
44
|
+
* @throws Error if no matching provider is found.
|
|
45
|
+
*/
|
|
29
46
|
export async function removeProvider(idOrName) {
|
|
30
47
|
const config = await readConfig();
|
|
31
48
|
const index = config.providers.findIndex((p) => p.id === idOrName || p.name === idOrName);
|
|
@@ -34,7 +51,10 @@ export async function removeProvider(idOrName) {
|
|
|
34
51
|
config.providers.splice(index, 1);
|
|
35
52
|
await writeConfig(config);
|
|
36
53
|
}
|
|
37
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Looks up a provider by id or name.
|
|
56
|
+
* @returns The matched provider, or `undefined` if none found.
|
|
57
|
+
*/
|
|
38
58
|
export async function findProvider(idOrName) {
|
|
39
59
|
const config = await readConfig();
|
|
40
60
|
return config.providers.find((p) => p.id === idOrName || p.name === idOrName);
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"provider-manager.js","sourceRoot":"","sources":["../../../src/providers/provider-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,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,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,SAAS,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,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;;;GAGG;AACH,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;;;GAGG;AACH,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;;;GAGG;AACH,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"}
|
package/dist/src/tui/App.d.ts
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Root TUI component. Manages screen routing between menu and sub-screens.
|
|
3
|
+
*/
|
|
1
4
|
import React from 'react';
|
|
2
5
|
import type { ExecRequest } from '../launcher/independent.js';
|
|
6
|
+
/** Available screens in the TUI. */
|
|
3
7
|
export type Screen = 'main' | 'launch' | 'providers' | 'profiles' | 'agents' | 'settings';
|
|
4
8
|
interface AppProps {
|
|
5
9
|
dev?: boolean;
|
|
6
10
|
onExec?: (req: ExecRequest) => void;
|
|
11
|
+
launchError?: {
|
|
12
|
+
agentId: string;
|
|
13
|
+
profileId?: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
};
|
|
16
|
+
agentStatusCache?: Record<string, boolean>;
|
|
7
17
|
}
|
|
8
|
-
|
|
18
|
+
/** Root Ink component that switches between TUI screens. */
|
|
19
|
+
export declare function App({ dev, onExec, launchError, agentStatusCache }: AppProps): React.JSX.Element;
|
|
9
20
|
export {};
|
|
10
21
|
//# sourceMappingURL=App.d.ts.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,oCAAoC;AACpC,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;IACpC,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,4DAA4D;AAC5D,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0C/F"}
|
package/dist/src/tui/App.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Root TUI component. Manages screen routing between menu and sub-screens.
|
|
4
|
+
*/
|
|
2
5
|
import { useState } from 'react';
|
|
3
6
|
import { useApp } from 'ink';
|
|
4
7
|
import { MainMenu } from './screens/MainMenu.js';
|
|
@@ -7,7 +10,8 @@ import { Providers } from './screens/Providers.js';
|
|
|
7
10
|
import { Profiles } from './screens/Profiles.js';
|
|
8
11
|
import { Agents } from './screens/Agents.js';
|
|
9
12
|
import { Settings } from './screens/Settings.js';
|
|
10
|
-
|
|
13
|
+
/** Root Ink component that switches between TUI screens. */
|
|
14
|
+
export function App({ dev, onExec, launchError, agentStatusCache }) {
|
|
11
15
|
const [screen, setScreen] = useState('main');
|
|
12
16
|
const { exit } = useApp();
|
|
13
17
|
const navigate = (target) => {
|
|
@@ -24,7 +28,7 @@ export function App({ dev, onExec }) {
|
|
|
24
28
|
return _jsx(MainMenu, { onSelect: navigate, onExit: exit });
|
|
25
29
|
}
|
|
26
30
|
if (screen === 'launch') {
|
|
27
|
-
return _jsx(LaunchAgent, { dev: dev, onBack: goBack, onExec: handleExec });
|
|
31
|
+
return _jsx(LaunchAgent, { dev: dev, onBack: goBack, onExec: handleExec, launchError: launchError, agentStatusCache: agentStatusCache });
|
|
28
32
|
}
|
|
29
33
|
if (screen === 'providers') {
|
|
30
34
|
return _jsx(Providers, { onBack: goBack });
|
package/dist/src/tui/App.js.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/tui/App.tsx"],"names":[],"mappings":";AAAA;;GAEG;AACH,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;AAajD,4DAA4D;AAC5D,MAAM,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAY;IAC1E,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,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,GAAI,CAAC;IACrI,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,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AgentId } from '../../config/schema.js';
|
|
3
|
+
interface AgentInstallProps {
|
|
4
|
+
agentId: AgentId;
|
|
5
|
+
onBack: () => void;
|
|
6
|
+
onDone: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function AgentInstall({ agentId, onBack, onDone }: AgentInstallProps): React.JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=AgentInstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentInstall.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/AgentInstall.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAqBtD,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqO9F"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { useKeyInput } from '../use-key-input.js';
|
|
5
|
+
import { getInstaller } from '../../installers/registry.js';
|
|
6
|
+
const AGENT_LABELS = {
|
|
7
|
+
'claude-code': 'Claude Code',
|
|
8
|
+
opencode: 'OpenCode',
|
|
9
|
+
qwen: 'Qwen CLI',
|
|
10
|
+
codex: 'Codex CLI',
|
|
11
|
+
copilot: 'Copilot CLI',
|
|
12
|
+
};
|
|
13
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
14
|
+
export function AgentInstall({ agentId, onBack, onDone }) {
|
|
15
|
+
const [subScreen, setSubScreen] = useState('choice');
|
|
16
|
+
const [selectedChoice, setSelectedChoice] = useState(0);
|
|
17
|
+
const [spinnerFrame, setSpinnerFrame] = useState(0);
|
|
18
|
+
const [missingDeps, setMissingDeps] = useState([]);
|
|
19
|
+
const [installError, setInstallError] = useState('');
|
|
20
|
+
const agentLabel = AGENT_LABELS[agentId];
|
|
21
|
+
const installer = getInstaller(agentId);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (subScreen === 'auto-checking' || subScreen === 'installing') {
|
|
24
|
+
const id = setInterval(() => {
|
|
25
|
+
setSpinnerFrame((f) => (f + 1) % SPINNER_FRAMES.length);
|
|
26
|
+
}, 80);
|
|
27
|
+
return () => clearInterval(id);
|
|
28
|
+
}
|
|
29
|
+
}, [subScreen]);
|
|
30
|
+
const runAutoInstall = () => {
|
|
31
|
+
if (!installer) {
|
|
32
|
+
setInstallError('Установщик не найден');
|
|
33
|
+
setSubScreen('error-install');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setSubScreen('auto-checking');
|
|
37
|
+
installer.checkEnvironment().then((envResult) => {
|
|
38
|
+
if (!envResult.ok) {
|
|
39
|
+
setMissingDeps(envResult.missing);
|
|
40
|
+
setSubScreen('error-env');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
setSubScreen('installing');
|
|
44
|
+
installer.install().then((result) => {
|
|
45
|
+
if (result.success) {
|
|
46
|
+
setSubScreen('success');
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
setInstallError(result.error ?? 'Неизвестная ошибка');
|
|
50
|
+
setSubScreen('error-install');
|
|
51
|
+
}
|
|
52
|
+
}).catch((err) => {
|
|
53
|
+
setInstallError(String(err));
|
|
54
|
+
setSubScreen('error-install');
|
|
55
|
+
});
|
|
56
|
+
}).catch((err) => {
|
|
57
|
+
setInstallError(String(err));
|
|
58
|
+
setSubScreen('error-install');
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
useKeyInput((_input, key) => {
|
|
62
|
+
if (subScreen === 'auto-checking' || subScreen === 'installing')
|
|
63
|
+
return;
|
|
64
|
+
if (key.escape) {
|
|
65
|
+
if (subScreen === 'choice') {
|
|
66
|
+
onBack();
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
setSubScreen('choice');
|
|
70
|
+
setSelectedChoice(0);
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (subScreen === 'choice') {
|
|
75
|
+
if (key.upArrow)
|
|
76
|
+
setSelectedChoice((s) => Math.max(0, s - 1));
|
|
77
|
+
if (key.downArrow)
|
|
78
|
+
setSelectedChoice((s) => Math.min(1, s + 1));
|
|
79
|
+
if (key.return) {
|
|
80
|
+
if (selectedChoice === 0) {
|
|
81
|
+
runAutoInstall();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
setSubScreen('manual');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (subScreen === 'success' && key.return) {
|
|
89
|
+
onDone();
|
|
90
|
+
}
|
|
91
|
+
if (subScreen === 'error-env') {
|
|
92
|
+
if (key.upArrow)
|
|
93
|
+
setSelectedChoice((s) => Math.max(0, s - 1));
|
|
94
|
+
if (key.downArrow)
|
|
95
|
+
setSelectedChoice((s) => Math.min(1, s + 1));
|
|
96
|
+
if (key.return) {
|
|
97
|
+
if (selectedChoice === 0) {
|
|
98
|
+
setSubScreen('manual');
|
|
99
|
+
setSelectedChoice(0);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
setSubScreen('choice');
|
|
103
|
+
setSelectedChoice(0);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (subScreen === 'error-install') {
|
|
108
|
+
if (key.upArrow)
|
|
109
|
+
setSelectedChoice((s) => Math.max(0, s - 1));
|
|
110
|
+
if (key.downArrow)
|
|
111
|
+
setSelectedChoice((s) => Math.min(1, s + 1));
|
|
112
|
+
if (key.return) {
|
|
113
|
+
if (selectedChoice === 0) {
|
|
114
|
+
setSelectedChoice(0);
|
|
115
|
+
runAutoInstall();
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
setSubScreen('manual');
|
|
119
|
+
setSelectedChoice(0);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (subScreen === 'manual' && key.escape) {
|
|
124
|
+
setSubScreen('choice');
|
|
125
|
+
setSelectedChoice(0);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
const spinner = SPINNER_FRAMES[spinnerFrame];
|
|
129
|
+
if (subScreen === 'choice') {
|
|
130
|
+
const choices = ['Авто-установка', 'Ручная установка'];
|
|
131
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Text, { bold: true, children: ["\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430: ", agentLabel] }), _jsx(Text, { children: "\u0410\u0433\u0435\u043D\u0442 \u043D\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D." }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: choices.map((c, i) => (_jsxs(Text, { color: i === selectedChoice ? 'green' : undefined, children: [i === selectedChoice ? '▶ ' : ' ', c] }, i))) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "[Esc] \u041D\u0430\u0437\u0430\u0434" }) })] }));
|
|
132
|
+
}
|
|
133
|
+
if (subScreen === 'auto-checking') {
|
|
134
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Text, { bold: true, children: ["\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430: ", agentLabel] }), _jsxs(Text, { children: [spinner, " \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0441\u0440\u0435\u0434\u044B..."] })] }));
|
|
135
|
+
}
|
|
136
|
+
if (subScreen === 'installing') {
|
|
137
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Text, { bold: true, children: ["\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430: ", agentLabel] }), _jsxs(Text, { children: [spinner, " \u0423\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F..."] })] }));
|
|
138
|
+
}
|
|
139
|
+
if (subScreen === 'success') {
|
|
140
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Text, { color: "green", children: ["\u2713 ", agentLabel, " \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D!"] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "[Enter] \u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C" }) })] }));
|
|
141
|
+
}
|
|
142
|
+
if (subScreen === 'error-env') {
|
|
143
|
+
const missing = missingDeps.join(', ');
|
|
144
|
+
const choices = ['Ручная установка', 'Назад'];
|
|
145
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Text, { color: "red", children: ["\u2717 \u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E: ", missing] }), _jsxs(Text, { children: ["\u0414\u043B\u044F \u0430\u0432\u0442\u043E-\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F ", missing, "."] }), _jsx(Text, { children: "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0440\u0443\u0447\u043D\u0443\u044E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443." }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: choices.map((c, i) => (_jsxs(Text, { color: i === selectedChoice ? 'green' : undefined, children: [i === selectedChoice ? '▶ ' : ' ', c] }, i))) })] }));
|
|
146
|
+
}
|
|
147
|
+
if (subScreen === 'error-install') {
|
|
148
|
+
const choices = ['Повторить', 'Ручная установка'];
|
|
149
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { color: "red", children: "\u2717 \u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438" }), _jsx(Text, { dimColor: true, children: installError }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: choices.map((c, i) => (_jsxs(Text, { color: i === selectedChoice ? 'green' : undefined, children: [i === selectedChoice ? '▶ ' : ' ', c] }, i))) })] }));
|
|
150
|
+
}
|
|
151
|
+
if (subScreen === 'manual') {
|
|
152
|
+
const instructions = installer?.manualInstructions;
|
|
153
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Text, { bold: true, children: ["\u0420\u0443\u0447\u043D\u0430\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430: ", agentLabel] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { children: "\u0412\u044B\u043F\u043E\u043B\u043D\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u044B:" }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: instructions?.commands.map((cmd, i) => (_jsxs(Text, { color: "cyan", children: [" ", cmd] }, i))) })] }), instructions?.docsUrl && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { children: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044F:" }), _jsxs(Text, { color: "blue", children: [" ", instructions.docsUrl] })] })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "[Esc] \u041D\u0430\u0437\u0430\u0434" }) })] }));
|
|
154
|
+
}
|
|
155
|
+
return _jsx(Box, {});
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=AgentInstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentInstall.js","sourceRoot":"","sources":["../../../../src/tui/screens/AgentInstall.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ interface AgentsProps {
|
|
|
3
3
|
dev?: boolean;
|
|
4
4
|
onBack: () => void;
|
|
5
5
|
}
|
|
6
|
+
/** Ink component that displays agent config status and allows restoring from backup. */
|
|
6
7
|
export declare function Agents({ dev, onBack }: AgentsProps): React.JSX.Element;
|
|
7
8
|
export {};
|
|
8
9
|
//# sourceMappingURL=Agents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Agents.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/Agents.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Agents.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/Agents.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AA6BhE,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wFAAwF;AACxF,wBAAgB,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkEtE"}
|
|
@@ -7,13 +7,16 @@ import { claudeCodeAdapter } from '../../adapters/claude-code.js';
|
|
|
7
7
|
import { openCodeAdapter } from '../../adapters/opencode.js';
|
|
8
8
|
import { qwenAdapter } from '../../adapters/qwen.js';
|
|
9
9
|
import { codexAdapter } from '../../adapters/codex.js';
|
|
10
|
-
|
|
10
|
+
import { copilotAdapter } from '../../adapters/copilot.js';
|
|
11
|
+
const ALL_ADAPTERS = [claudeCodeAdapter, openCodeAdapter, qwenAdapter, codexAdapter, copilotAdapter];
|
|
11
12
|
const SCOPES = ['global', 'project'];
|
|
13
|
+
/** Returns all adapters, filtering out `dev` ones unless `--dev` is passed. */
|
|
12
14
|
function getAdapters(dev = false) {
|
|
13
15
|
if (dev)
|
|
14
16
|
return ALL_ADAPTERS;
|
|
15
17
|
return ALL_ADAPTERS.filter((a) => !a.dev);
|
|
16
18
|
}
|
|
19
|
+
/** Ink component that displays agent config status and allows restoring from backup. */
|
|
17
20
|
export function Agents({ dev, onBack }) {
|
|
18
21
|
const [statuses, setStatuses] = useState([]);
|
|
19
22
|
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Agents.js","sourceRoot":"","sources":["../../../../src/tui/screens/Agents.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"Agents.js","sourceRoot":"","sources":["../../../../src/tui/screens/Agents.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,20 @@ interface LaunchAgentProps {
|
|
|
4
4
|
dev?: boolean;
|
|
5
5
|
onBack: () => void;
|
|
6
6
|
onExec?: (req: ExecRequest) => void;
|
|
7
|
+
launchError?: {
|
|
8
|
+
agentId: string;
|
|
9
|
+
profileId?: string;
|
|
10
|
+
error?: string;
|
|
11
|
+
};
|
|
12
|
+
agentStatusCache?: Record<string, boolean>;
|
|
7
13
|
}
|
|
8
|
-
|
|
14
|
+
/**
|
|
15
|
+
* LaunchAgent screen — multi-step wizard:
|
|
16
|
+
* 1. Select profile
|
|
17
|
+
* 2. Select compatible agent (with install-check)
|
|
18
|
+
* 3. (Optional) Install wizard if agent not installed
|
|
19
|
+
* 4. Launch agent (delegates to child or independent launcher)
|
|
20
|
+
*/
|
|
21
|
+
export declare function LaunchAgent({ dev, onBack, onExec, launchError, agentStatusCache }: LaunchAgentProps): React.JSX.Element;
|
|
9
22
|
export {};
|
|
10
23
|
//# sourceMappingURL=LaunchAgent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LaunchAgent.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/LaunchAgent.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"LaunchAgent.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/LaunchAgent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAa3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAOjE,UAAU,gBAAgB;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAiCD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA4SvH"}
|
|
@@ -1,25 +1,32 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect } from 'react';
|
|
2
|
+
import { useState, useEffect, useRef } from 'react';
|
|
3
3
|
import { Box, Text } from 'ink';
|
|
4
4
|
import { useKeyInput } from '../use-key-input.js';
|
|
5
|
-
import { readConfig } from '../../config/store.js';
|
|
5
|
+
import { readConfig, readAgentStatusCache, writeAgentStatusCache } from '../../config/store.js';
|
|
6
6
|
import { claudeCodeAdapter } from '../../adapters/claude-code.js';
|
|
7
7
|
import { openCodeAdapter } from '../../adapters/opencode.js';
|
|
8
8
|
import { qwenAdapter } from '../../adapters/qwen.js';
|
|
9
9
|
import { codexAdapter } from '../../adapters/codex.js';
|
|
10
|
+
import { copilotAdapter } from '../../adapters/copilot.js';
|
|
10
11
|
import { prepareChild } from '../../launcher/child.js';
|
|
11
12
|
import { launchIndependent } from '../../launcher/independent.js';
|
|
13
|
+
import { getInstaller } from '../../installers/registry.js';
|
|
14
|
+
import { AgentInstall } from './AgentInstall.js';
|
|
15
|
+
/** All agents available for launching. */
|
|
12
16
|
const ALL_AGENTS = [
|
|
13
17
|
{ id: 'claude-code', label: 'Claude Code', adapter: claudeCodeAdapter, command: 'claude' },
|
|
14
18
|
{ id: 'opencode', label: 'OpenCode', adapter: openCodeAdapter, command: 'opencode' },
|
|
15
19
|
{ id: 'qwen', label: 'Qwen CLI', adapter: qwenAdapter, command: 'qwen' },
|
|
16
20
|
{ id: 'codex', label: 'Codex CLI', adapter: codexAdapter, command: 'codex', args: ['-p', 'default'] },
|
|
21
|
+
{ id: 'copilot', label: 'Copilot CLI', adapter: copilotAdapter, command: 'copilot' },
|
|
17
22
|
];
|
|
23
|
+
/** Returns the agent list, filtering out `dev` agents unless `dev` is true. */
|
|
18
24
|
function getAgents(dev = false) {
|
|
19
25
|
if (dev)
|
|
20
26
|
return ALL_AGENTS;
|
|
21
27
|
return ALL_AGENTS.filter((a) => !a.adapter.dev);
|
|
22
28
|
}
|
|
29
|
+
/** Filters agents to those whose `supportedProviderTypes` cover every provider in the selected profile. */
|
|
23
30
|
function getCompatibleAgents(agents, profile, providers) {
|
|
24
31
|
const providerTypes = new Set();
|
|
25
32
|
for (const model of profile.models) {
|
|
@@ -29,7 +36,14 @@ function getCompatibleAgents(agents, profile, providers) {
|
|
|
29
36
|
}
|
|
30
37
|
return agents.filter((a) => [...providerTypes].every((t) => a.adapter.supportedProviderTypes.includes(t)));
|
|
31
38
|
}
|
|
32
|
-
|
|
39
|
+
/**
|
|
40
|
+
* LaunchAgent screen — multi-step wizard:
|
|
41
|
+
* 1. Select profile
|
|
42
|
+
* 2. Select compatible agent (with install-check)
|
|
43
|
+
* 3. (Optional) Install wizard if agent not installed
|
|
44
|
+
* 4. Launch agent (delegates to child or independent launcher)
|
|
45
|
+
*/
|
|
46
|
+
export function LaunchAgent({ dev, onBack, onExec, launchError, agentStatusCache }) {
|
|
33
47
|
const [step, setStep] = useState('profile');
|
|
34
48
|
const [profiles, setProfiles] = useState([]);
|
|
35
49
|
const [providers, setProviders] = useState([]);
|
|
@@ -38,6 +52,15 @@ export function LaunchAgent({ dev, onBack, onExec }) {
|
|
|
38
52
|
const [selectedAgent, setSelectedAgent] = useState(0);
|
|
39
53
|
const [status, setStatus] = useState('');
|
|
40
54
|
const [error, setError] = useState('');
|
|
55
|
+
const [installStatuses, setInstallStatuses] = useState(() => ({ ...agentStatusCache }));
|
|
56
|
+
// Ref so the install-check effect always reads current statuses without adding
|
|
57
|
+
// installStatuses to its dependency array (which would cause an infinite loop).
|
|
58
|
+
const installStatusesRef = useRef(installStatuses);
|
|
59
|
+
installStatusesRef.current = installStatuses;
|
|
60
|
+
const [installAgentId, setInstallAgentId] = useState(null);
|
|
61
|
+
const [statusChecking, setStatusChecking] = useState(false);
|
|
62
|
+
const [checkProgress, setCheckProgress] = useState({});
|
|
63
|
+
const [spinnerFrame, setSpinnerFrame] = useState(0);
|
|
41
64
|
useEffect(() => {
|
|
42
65
|
readConfig()
|
|
43
66
|
.then((config) => {
|
|
@@ -46,10 +69,95 @@ export function LaunchAgent({ dev, onBack, onExec }) {
|
|
|
46
69
|
setSettings(config.settings);
|
|
47
70
|
})
|
|
48
71
|
.catch((err) => setError(String(err)));
|
|
72
|
+
readAgentStatusCache()
|
|
73
|
+
.then((cache) => {
|
|
74
|
+
if (Object.keys(cache).length > 0) {
|
|
75
|
+
setInstallStatuses((prev) => ({ ...prev, ...cache }));
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
.catch(() => { });
|
|
49
79
|
}, []);
|
|
80
|
+
const launchErrorHandled = useRef(false);
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
if (!launchError || launchErrorHandled.current || profiles.length === 0)
|
|
83
|
+
return;
|
|
84
|
+
launchErrorHandled.current = true;
|
|
85
|
+
const idx = profiles.findIndex((p) => p.id === launchError.profileId);
|
|
86
|
+
if (idx >= 0)
|
|
87
|
+
setSelectedProfile(idx);
|
|
88
|
+
setInstallStatuses((prev) => ({ ...prev, [launchError.agentId]: false }));
|
|
89
|
+
setError(launchError.error || `Agent ${launchError.agentId} not installed`);
|
|
90
|
+
setStep('agent');
|
|
91
|
+
}, [profiles, launchError]);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (step !== 'agent')
|
|
94
|
+
return;
|
|
95
|
+
const currentStatuses = installStatusesRef.current;
|
|
96
|
+
const agentsToCheck = ALL_AGENTS.filter((a) => currentStatuses[a.id] !== true);
|
|
97
|
+
const initialProgress = {};
|
|
98
|
+
for (const a of ALL_AGENTS) {
|
|
99
|
+
initialProgress[a.id] = currentStatuses[a.id] === true ? 'done' : agentsToCheck.some((x) => x.id === a.id) ? 'pending' : 'done';
|
|
100
|
+
}
|
|
101
|
+
setCheckProgress(initialProgress);
|
|
102
|
+
if (agentsToCheck.length === 0) {
|
|
103
|
+
setStatusChecking(true);
|
|
104
|
+
setTimeout(() => setStatusChecking(false), 200);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
setStatusChecking(true);
|
|
108
|
+
setTimeout(() => {
|
|
109
|
+
const checks = agentsToCheck.map(async (a) => {
|
|
110
|
+
setCheckProgress((prev) => ({ ...prev, [a.id]: 'checking' }));
|
|
111
|
+
const installer = getInstaller(a.id);
|
|
112
|
+
if (!installer) {
|
|
113
|
+
setCheckProgress((prev) => ({ ...prev, [a.id]: 'done' }));
|
|
114
|
+
return [a.id, true];
|
|
115
|
+
}
|
|
116
|
+
const result = await installer.checkInstalled();
|
|
117
|
+
setCheckProgress((prev) => ({ ...prev, [a.id]: 'done' }));
|
|
118
|
+
return [a.id, result.installed];
|
|
119
|
+
});
|
|
120
|
+
Promise.all([...checks, new Promise((r) => setTimeout(r, 200))])
|
|
121
|
+
.then((results) => {
|
|
122
|
+
const agentResults = results.slice(0, -1);
|
|
123
|
+
setInstallStatuses((prev) => {
|
|
124
|
+
const next = { ...prev };
|
|
125
|
+
for (const [id, installed] of agentResults)
|
|
126
|
+
next[id] = installed;
|
|
127
|
+
return next;
|
|
128
|
+
});
|
|
129
|
+
})
|
|
130
|
+
.catch(() => { })
|
|
131
|
+
.finally(() => {
|
|
132
|
+
setStatusChecking(false);
|
|
133
|
+
});
|
|
134
|
+
}, 0);
|
|
135
|
+
}, [step]);
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
// Intentional shared-reference mutation: propagates install statuses back to the
|
|
138
|
+
// module-level cache in start.ts for cross-relaunch persistence within the same process.
|
|
139
|
+
if (agentStatusCache) {
|
|
140
|
+
Object.assign(agentStatusCache, installStatuses);
|
|
141
|
+
}
|
|
142
|
+
// Guard: skip disk write when state is still empty (initial mount before any checks run)
|
|
143
|
+
// to avoid overwriting a valid on-disk cache with a blank object.
|
|
144
|
+
if (Object.keys(installStatuses).length === 0)
|
|
145
|
+
return;
|
|
146
|
+
writeAgentStatusCache(installStatuses).catch(() => { });
|
|
147
|
+
}, [installStatuses]);
|
|
148
|
+
useEffect(() => {
|
|
149
|
+
if (!statusChecking)
|
|
150
|
+
return;
|
|
151
|
+
const id = setInterval(() => setSpinnerFrame((f) => (f + 1) % 10), 80);
|
|
152
|
+
return () => clearInterval(id);
|
|
153
|
+
}, [statusChecking]);
|
|
50
154
|
useKeyInput((input, key) => {
|
|
51
155
|
if (step === 'launching' && !error)
|
|
52
156
|
return;
|
|
157
|
+
if (step === 'install')
|
|
158
|
+
return;
|
|
159
|
+
if (step === 'agent' && statusChecking)
|
|
160
|
+
return;
|
|
53
161
|
if (key.escape || input === 'q') {
|
|
54
162
|
if (step === 'profile') {
|
|
55
163
|
onBack();
|
|
@@ -86,6 +194,11 @@ export function LaunchAgent({ dev, onBack, onExec }) {
|
|
|
86
194
|
setError('Invalid selection');
|
|
87
195
|
return;
|
|
88
196
|
}
|
|
197
|
+
if (installStatuses[agentEntry.id] === false) {
|
|
198
|
+
setInstallAgentId(agentEntry.id);
|
|
199
|
+
setStep('install');
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
89
202
|
setStep('launching');
|
|
90
203
|
setStatus(`Launching ${agentEntry.label}...`);
|
|
91
204
|
const scope = settings.defaultConfigScope;
|
|
@@ -129,8 +242,28 @@ export function LaunchAgent({ dev, onBack, onExec }) {
|
|
|
129
242
|
const visibleAgents = profile
|
|
130
243
|
? getCompatibleAgents(getAgents(dev), profile, providers)
|
|
131
244
|
: getAgents(dev);
|
|
132
|
-
|
|
133
|
-
|
|
245
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
246
|
+
if (step === 'agent' && statusChecking) {
|
|
247
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, children: "Select Agent" }), _jsx(Text, { dimColor: true, children: "\u2191\u2193 navigate, Enter select, Esc back" }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: visibleAgents.map((item, i) => {
|
|
248
|
+
const state = checkProgress[item.id] ?? 'pending';
|
|
249
|
+
const icon = state === 'done' ? '✓' : state === 'checking' ? SPINNER_FRAMES[spinnerFrame] : '○';
|
|
250
|
+
const color = state === 'done' ? 'green' : state === 'checking' ? 'yellow' : 'gray';
|
|
251
|
+
return (_jsxs(Text, { color: color, dimColor: state === 'pending', children: [icon, " ", item.label, state === 'checking' && _jsx(Text, { dimColor: true, children: " checking..." })] }, i));
|
|
252
|
+
}) })] }));
|
|
253
|
+
}
|
|
254
|
+
if (step === 'agent') {
|
|
255
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, children: "Select Agent" }), _jsx(Text, { dimColor: true, children: "\u2191\u2193 navigate, Enter select, Esc back" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [visibleAgents.map((item, i) => {
|
|
256
|
+
const installed = installStatuses[item.id] !== false;
|
|
257
|
+
return (_jsxs(Text, { color: i === selectedAgent ? 'green' : undefined, children: [i === selectedAgent ? '▶ ' : ' ', item.label, !installed && (_jsx(Text, { dimColor: true, children: " (not installed)" }))] }, i));
|
|
258
|
+
}), visibleAgents.length === 0 && _jsx(Text, { dimColor: true, children: "No items available" })] })] }));
|
|
259
|
+
}
|
|
260
|
+
if (step === 'install' && installAgentId) {
|
|
261
|
+
return (_jsx(AgentInstall, { agentId: installAgentId, onBack: () => { setInstallAgentId(null); setStep('agent'); }, onDone: () => {
|
|
262
|
+
setInstallStatuses((prev) => ({ ...prev, [installAgentId]: true }));
|
|
263
|
+
setInstallAgentId(null);
|
|
264
|
+
setStep('agent');
|
|
265
|
+
} }));
|
|
266
|
+
}
|
|
134
267
|
return (_jsx(Box, { flexDirection: "column", padding: 1, children: _jsx(Text, { children: status || 'Launching...' }) }));
|
|
135
268
|
}
|
|
136
269
|
//# sourceMappingURL=LaunchAgent.js.map
|