@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.
Files changed (121) hide show
  1. package/AGENTS.md +28 -0
  2. package/CHANGELOG.md +33 -1
  3. package/README.md +28 -18
  4. package/README.ru.md +28 -18
  5. package/dist/bin/agento.js +34 -5
  6. package/dist/bin/agento.js.map +1 -1
  7. package/dist/src/adapters/copilot.d.ts +15 -0
  8. package/dist/src/adapters/copilot.d.ts.map +1 -0
  9. package/dist/src/adapters/copilot.js +71 -0
  10. package/dist/src/adapters/copilot.js.map +1 -0
  11. package/dist/src/adapters/opencode.d.ts +1 -0
  12. package/dist/src/adapters/opencode.d.ts.map +1 -1
  13. package/dist/src/adapters/opencode.js +10 -0
  14. package/dist/src/adapters/opencode.js.map +1 -1
  15. package/dist/src/cli/commands/agent.d.ts +7 -0
  16. package/dist/src/cli/commands/agent.d.ts.map +1 -1
  17. package/dist/src/cli/commands/agent.js +10 -1
  18. package/dist/src/cli/commands/agent.js.map +1 -1
  19. package/dist/src/cli/commands/launch.d.ts +7 -0
  20. package/dist/src/cli/commands/launch.d.ts.map +1 -1
  21. package/dist/src/cli/commands/launch.js +16 -5
  22. package/dist/src/cli/commands/launch.js.map +1 -1
  23. package/dist/src/cli/commands/profile.d.ts +6 -0
  24. package/dist/src/cli/commands/profile.d.ts.map +1 -1
  25. package/dist/src/cli/commands/profile.js +6 -0
  26. package/dist/src/cli/commands/profile.js.map +1 -1
  27. package/dist/src/cli/commands/provider.d.ts +6 -0
  28. package/dist/src/cli/commands/provider.d.ts.map +1 -1
  29. package/dist/src/cli/commands/provider.js +6 -0
  30. package/dist/src/cli/commands/provider.js.map +1 -1
  31. package/dist/src/cli/commands/restore.d.ts +8 -0
  32. package/dist/src/cli/commands/restore.d.ts.map +1 -1
  33. package/dist/src/cli/commands/restore.js +8 -0
  34. package/dist/src/cli/commands/restore.js.map +1 -1
  35. package/dist/src/config/schema.d.ts +1 -1
  36. package/dist/src/config/schema.d.ts.map +1 -1
  37. package/dist/src/config/schema.js +1 -1
  38. package/dist/src/config/schema.js.map +1 -1
  39. package/dist/src/config/store.d.ts +4 -0
  40. package/dist/src/config/store.d.ts.map +1 -1
  41. package/dist/src/config/store.js +18 -0
  42. package/dist/src/config/store.js.map +1 -1
  43. package/dist/src/installers/base.d.ts +25 -0
  44. package/dist/src/installers/base.d.ts.map +1 -0
  45. package/dist/src/installers/base.js +2 -0
  46. package/dist/src/installers/base.js.map +1 -0
  47. package/dist/src/installers/claude-code.d.ts +19 -0
  48. package/dist/src/installers/claude-code.d.ts.map +1 -0
  49. package/dist/src/installers/claude-code.js +55 -0
  50. package/dist/src/installers/claude-code.js.map +1 -0
  51. package/dist/src/installers/codex.d.ts +19 -0
  52. package/dist/src/installers/codex.d.ts.map +1 -0
  53. package/dist/src/installers/codex.js +55 -0
  54. package/dist/src/installers/codex.js.map +1 -0
  55. package/dist/src/installers/copilot.d.ts +19 -0
  56. package/dist/src/installers/copilot.d.ts.map +1 -0
  57. package/dist/src/installers/copilot.js +55 -0
  58. package/dist/src/installers/copilot.js.map +1 -0
  59. package/dist/src/installers/opencode.d.ts +19 -0
  60. package/dist/src/installers/opencode.d.ts.map +1 -0
  61. package/dist/src/installers/opencode.js +55 -0
  62. package/dist/src/installers/opencode.js.map +1 -0
  63. package/dist/src/installers/qwen.d.ts +19 -0
  64. package/dist/src/installers/qwen.d.ts.map +1 -0
  65. package/dist/src/installers/qwen.js +55 -0
  66. package/dist/src/installers/qwen.js.map +1 -0
  67. package/dist/src/installers/registry.d.ts +11 -0
  68. package/dist/src/installers/registry.d.ts.map +1 -0
  69. package/dist/src/installers/registry.js +18 -0
  70. package/dist/src/installers/registry.js.map +1 -0
  71. package/dist/src/launcher/child.js +1 -1
  72. package/dist/src/launcher/child.js.map +1 -1
  73. package/dist/src/launcher/independent.d.ts +16 -3
  74. package/dist/src/launcher/independent.d.ts.map +1 -1
  75. package/dist/src/launcher/independent.js +12 -3
  76. package/dist/src/launcher/independent.js.map +1 -1
  77. package/dist/src/profiles/profile-manager.d.ts +26 -7
  78. package/dist/src/profiles/profile-manager.d.ts.map +1 -1
  79. package/dist/src/profiles/profile-manager.js +26 -7
  80. package/dist/src/profiles/profile-manager.js.map +1 -1
  81. package/dist/src/providers/provider-manager.d.ts +18 -5
  82. package/dist/src/providers/provider-manager.d.ts.map +1 -1
  83. package/dist/src/providers/provider-manager.js +25 -5
  84. package/dist/src/providers/provider-manager.js.map +1 -1
  85. package/dist/src/tui/App.d.ts +12 -1
  86. package/dist/src/tui/App.d.ts.map +1 -1
  87. package/dist/src/tui/App.js +6 -2
  88. package/dist/src/tui/App.js.map +1 -1
  89. package/dist/src/tui/screens/AgentInstall.d.ts +10 -0
  90. package/dist/src/tui/screens/AgentInstall.d.ts.map +1 -0
  91. package/dist/src/tui/screens/AgentInstall.js +157 -0
  92. package/dist/src/tui/screens/AgentInstall.js.map +1 -0
  93. package/dist/src/tui/screens/Agents.d.ts +1 -0
  94. package/dist/src/tui/screens/Agents.d.ts.map +1 -1
  95. package/dist/src/tui/screens/Agents.js +4 -1
  96. package/dist/src/tui/screens/Agents.js.map +1 -1
  97. package/dist/src/tui/screens/LaunchAgent.d.ts +14 -1
  98. package/dist/src/tui/screens/LaunchAgent.d.ts.map +1 -1
  99. package/dist/src/tui/screens/LaunchAgent.js +138 -5
  100. package/dist/src/tui/screens/LaunchAgent.js.map +1 -1
  101. package/dist/src/tui/screens/MainMenu.d.ts +7 -0
  102. package/dist/src/tui/screens/MainMenu.d.ts.map +1 -1
  103. package/dist/src/tui/screens/MainMenu.js +7 -0
  104. package/dist/src/tui/screens/MainMenu.js.map +1 -1
  105. package/dist/src/tui/screens/Profiles.d.ts +1 -0
  106. package/dist/src/tui/screens/Profiles.d.ts.map +1 -1
  107. package/dist/src/tui/screens/Profiles.js +1 -0
  108. package/dist/src/tui/screens/Profiles.js.map +1 -1
  109. package/dist/src/tui/screens/Providers.d.ts +1 -0
  110. package/dist/src/tui/screens/Providers.d.ts.map +1 -1
  111. package/dist/src/tui/screens/Providers.js +1 -0
  112. package/dist/src/tui/screens/Providers.js.map +1 -1
  113. package/dist/src/tui/screens/Settings.d.ts +1 -0
  114. package/dist/src/tui/screens/Settings.d.ts.map +1 -1
  115. package/dist/src/tui/screens/Settings.js +20 -3
  116. package/dist/src/tui/screens/Settings.js.map +1 -1
  117. package/dist/src/tui/start.d.ts +9 -0
  118. package/dist/src/tui/start.d.ts.map +1 -1
  119. package/dist/src/tui/start.js +15 -0
  120. package/dist/src/tui/start.js.map +1 -1
  121. 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
- /** Обновляет провайдера по id. Выбрасывает Error если не найден. */
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
- /** Удаляет провайдера по id или имени. Выбрасывает Error если не найден. */
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
- /** Находит провайдера по id или имени. Возвращает undefined если не найден. */
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,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"}
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"}
@@ -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
- export declare function App({ dev, onExec }: AppProps): React.JSX.Element;
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;CACrC;AAED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0ChE"}
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"}
@@ -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
- export function App({ dev, onExec }) {
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 });
@@ -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;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"}
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;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"}
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
- const ALL_ADAPTERS = [claudeCodeAdapter, openCodeAdapter, qwenAdapter, codexAdapter];
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":"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"}
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;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,MAAM,YAAY,GAAmB,CAAC,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;AACrH,MAAM,MAAM,GAAgC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAElE,+EAA+E;AAC/E,SAAS,WAAW,CAAC,GAAG,GAAG,KAAK;IAC9B,IAAI,GAAG;QAAE,OAAO,YAAY,CAAC;IAC7B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAgBD,wFAAwF;AACxF,MAAM,UAAU,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAe;IACjD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEzC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC;oBACV,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,KAAK;oBACL,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC;oBACxB,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,WAAW,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,SAAS,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAErD,WAAW,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,MAAM,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACtD,IAAI,GAAG,CAAC,OAAO;YAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACxD,IAAI,GAAG,CAAC,SAAS;YAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACjF,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC;iBAC7B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBACrB,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACtD,MAAM,OAAO,CAAC,WAAW,CAAC,MAAiC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBACtE,MAAM,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;iBACpF,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,KAAC,IAAI,IAAC,IAAI,0CAA2B,EACrC,KAAC,IAAI,IAAC,QAAQ,mFAA0D,EACvE,MAAM,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,MAAM,GAAQ,EAC9C,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,YACrC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,KAAC,GAAG,IAAmC,aAAa,EAAC,QAAQ,YAC3D,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,aACnD,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EACjC,CAAC,CAAC,WAAW,QAAI,CAAC,CAAC,KAAK,QAAI,GAAG,EAChC,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,YACzC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAChC,EACN,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,aAAa,IAAI,KAAC,IAAI,IAAC,QAAQ,4CAA6B,IAC5E,IARC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,EAAE,CAS/B,CACP,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -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
- export declare function LaunchAgent({ dev, onBack, onExec }: LaunchAgentProps): React.JSX.Element;
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,KAA8B,MAAM,OAAO,CAAC;AAUnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAMjE,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;CACrC;AA6BD,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAyIxF"}
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
- export function LaunchAgent({ dev, onBack, onExec }) {
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
- if (step === 'agent')
133
- return renderList(visibleAgents, selectedAgent, 'Select Agent');
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