aemeathcli 1.0.9 → 1.0.11

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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +609 -608
  3. package/dist/App-YAHJUWCX.js +4274 -0
  4. package/dist/App-YAHJUWCX.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -0
  6. package/dist/agent-store/debugger.md +32 -0
  7. package/dist/agent-store/developer.md +29 -0
  8. package/dist/agent-store/documenter.md +30 -0
  9. package/dist/agent-store/researcher.md +31 -0
  10. package/dist/agent-store/reviewer.md +28 -0
  11. package/dist/agent-store/supervisor.md +37 -0
  12. package/dist/agent-store/tester.md +30 -0
  13. package/dist/api-key-fallback-UN3TJEOO.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-UN3TJEOO.js.map} +1 -1
  15. package/dist/auth-status-EIM5A5KL.js +13 -0
  16. package/dist/auth-status-EIM5A5KL.js.map +1 -0
  17. package/dist/{chunk-UY2SYSEZ.js → chunk-25UNNEHN.js} +32 -103
  18. package/dist/chunk-25UNNEHN.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2GKOK6T7.js} +28 -5
  20. package/dist/chunk-2GKOK6T7.js.map +1 -0
  21. package/dist/{chunk-MFBHNWGV.js → chunk-2LF7ALGR.js} +12 -20
  22. package/dist/chunk-2LF7ALGR.js.map +1 -0
  23. package/dist/{chunk-H66O5Z2V.js → chunk-2NWNIKBK.js} +42 -7
  24. package/dist/chunk-2NWNIKBK.js.map +1 -0
  25. package/dist/chunk-3TSPZRGM.js +26 -0
  26. package/dist/chunk-3TSPZRGM.js.map +1 -0
  27. package/dist/{chunk-ZGOHARPV.js → chunk-473JN6M5.js} +2 -2
  28. package/dist/chunk-473JN6M5.js.map +1 -0
  29. package/dist/{chunk-IYW62KKR.js → chunk-5XFSV6PF.js} +66 -23
  30. package/dist/chunk-5XFSV6PF.js.map +1 -0
  31. package/dist/{chunk-HCIHOHLX.js → chunk-62HSGYQD.js} +2 -2
  32. package/dist/chunk-62HSGYQD.js.map +1 -0
  33. package/dist/{chunk-I5PZ4JTS.js → chunk-6GUD7QIM.js} +4 -4
  34. package/dist/chunk-6GUD7QIM.js.map +1 -0
  35. package/dist/{chunk-4IJD72YB.js → chunk-AQ23TYSQ.js} +7 -7
  36. package/dist/chunk-AQ23TYSQ.js.map +1 -0
  37. package/dist/{chunk-NBR3GHMT.js → chunk-BY4DAKUU.js} +39 -7
  38. package/dist/chunk-BY4DAKUU.js.map +1 -0
  39. package/dist/chunk-CC7MGWYY.js +12 -0
  40. package/dist/chunk-CC7MGWYY.js.map +1 -0
  41. package/dist/chunk-CTFZTARK.js +155 -0
  42. package/dist/chunk-CTFZTARK.js.map +1 -0
  43. package/dist/chunk-FIC7AK4Q.js +232 -0
  44. package/dist/chunk-FIC7AK4Q.js.map +1 -0
  45. package/dist/chunk-GU33WKPG.js +140 -0
  46. package/dist/chunk-GU33WKPG.js.map +1 -0
  47. package/dist/{chunk-VUG4IZ7J.js → chunk-H2SYKIMI.js} +10 -10
  48. package/dist/chunk-H2SYKIMI.js.map +1 -0
  49. package/dist/{chunk-JAXXTYID.js → chunk-HEKFAKVH.js} +2 -2
  50. package/dist/chunk-HEKFAKVH.js.map +1 -0
  51. package/dist/chunk-IARA5XYP.js +186 -0
  52. package/dist/chunk-IARA5XYP.js.map +1 -0
  53. package/dist/{chunk-HMJRPNPZ.js → chunk-LCYH4T6N.js} +95 -23
  54. package/dist/chunk-LCYH4T6N.js.map +1 -0
  55. package/dist/{chunk-CARHU3DO.js → chunk-LDVY5ELP.js} +66 -18
  56. package/dist/chunk-LDVY5ELP.js.map +1 -0
  57. package/dist/chunk-OCJPQFOR.js +88 -0
  58. package/dist/chunk-OCJPQFOR.js.map +1 -0
  59. package/dist/chunk-ODBY7S4X.js +141 -0
  60. package/dist/chunk-ODBY7S4X.js.map +1 -0
  61. package/dist/{chunk-DAHGLHNR.js → chunk-ONQ4WCUI.js} +7 -142
  62. package/dist/chunk-ONQ4WCUI.js.map +1 -0
  63. package/dist/{chunk-WPP3PEDE.js → chunk-P5TKZM3T.js} +32 -107
  64. package/dist/chunk-P5TKZM3T.js.map +1 -0
  65. package/dist/{chunk-ASGRGXYK.js → chunk-P66WDACW.js} +23 -22
  66. package/dist/chunk-P66WDACW.js.map +1 -0
  67. package/dist/{chunk-LSOYPSAT.js → chunk-QCRK4QEL.js} +4 -4
  68. package/dist/chunk-QCRK4QEL.js.map +1 -0
  69. package/dist/{chunk-YL5XFHR3.js → chunk-ROJPFPJ7.js} +2 -2
  70. package/dist/chunk-ROJPFPJ7.js.map +1 -0
  71. package/dist/chunk-RP2TAL3J.js +71 -0
  72. package/dist/chunk-RP2TAL3J.js.map +1 -0
  73. package/dist/{chunk-6PDJ45T4.js → chunk-RYOB3TLZ.js} +51 -26
  74. package/dist/chunk-RYOB3TLZ.js.map +1 -0
  75. package/dist/{chunk-Y5XVD2CD.js → chunk-SOQFMNQC.js} +110 -83
  76. package/dist/chunk-SOQFMNQC.js.map +1 -0
  77. package/dist/{chunk-TEVZS4FA.js → chunk-TDFTX32B.js} +16 -9
  78. package/dist/chunk-TDFTX32B.js.map +1 -0
  79. package/dist/chunk-VBLLDY4R.js +38 -0
  80. package/dist/chunk-VBLLDY4R.js.map +1 -0
  81. package/dist/{chunk-CGEV3ARR.js → chunk-VJNQJALF.js} +4 -4
  82. package/dist/chunk-VJNQJALF.js.map +1 -0
  83. package/dist/chunk-WAYSJMPS.js +26 -0
  84. package/dist/chunk-WAYSJMPS.js.map +1 -0
  85. package/dist/chunk-WC72BRHR.js +241 -0
  86. package/dist/chunk-WC72BRHR.js.map +1 -0
  87. package/dist/{chunk-MXZSI3AY.js → chunk-YPFOE2QJ.js} +43 -11
  88. package/dist/chunk-YPFOE2QJ.js.map +1 -0
  89. package/dist/claude-adapter-6P4SJH7P.js +7 -0
  90. package/dist/{claude-adapter-QMLFMSP3.js.map → claude-adapter-6P4SJH7P.js.map} +1 -1
  91. package/dist/{claude-login-5WELXPKT.js → claude-login-IS5WTBMP.js} +10 -10
  92. package/dist/claude-login-IS5WTBMP.js.map +1 -0
  93. package/dist/cli.js +371 -172
  94. package/dist/cli.js.map +1 -1
  95. package/dist/{codex-login-DDJBCT43.js → codex-login-GMPF64MR.js} +18 -17
  96. package/dist/codex-login-GMPF64MR.js.map +1 -0
  97. package/dist/config-store-POB6I37G.js +7 -0
  98. package/dist/{config-store-W6FBCQAQ.js.map → config-store-POB6I37G.js.map} +1 -1
  99. package/dist/conversation-store-PRBHWQMJ.js +4 -0
  100. package/dist/conversation-store-PRBHWQMJ.js.map +1 -0
  101. package/dist/detect-providers-C4SVQHFF.js +4 -0
  102. package/dist/detect-providers-C4SVQHFF.js.map +1 -0
  103. package/dist/executor-RUX7VK3T.js +4 -0
  104. package/dist/{executor-6RIKIGXK.js.map → executor-RUX7VK3T.js.map} +1 -1
  105. package/dist/first-run-GDEVRFPO.js +230 -0
  106. package/dist/first-run-GDEVRFPO.js.map +1 -0
  107. package/dist/gemini-adapter-MV3U4QFH.js +7 -0
  108. package/dist/{gemini-adapter-6JIHZ7WI.js.map → gemini-adapter-MV3U4QFH.js.map} +1 -1
  109. package/dist/{gemini-login-YEPK6GGW.js → gemini-login-KE224MSW.js} +13 -14
  110. package/dist/gemini-login-KE224MSW.js.map +1 -0
  111. package/dist/index.d.ts +47 -17
  112. package/dist/index.js +86 -471
  113. package/dist/index.js.map +1 -1
  114. package/dist/input-history-MIOO3FIW.js +57 -0
  115. package/dist/input-history-MIOO3FIW.js.map +1 -0
  116. package/dist/kimi-adapter-UODMNX6K.js +6 -0
  117. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-UODMNX6K.js.map} +1 -1
  118. package/dist/{kimi-login-ZR74MIY4.js → kimi-login-DNT5YBKX.js} +18 -17
  119. package/dist/kimi-login-DNT5YBKX.js.map +1 -0
  120. package/dist/logger-PLPDWACQ.js +3 -0
  121. package/dist/logger-PLPDWACQ.js.map +1 -0
  122. package/dist/model-discovery-O64ZWPX5.js +6 -0
  123. package/dist/model-discovery-O64ZWPX5.js.map +1 -0
  124. package/dist/native-cli-adapters-JMZX2C2C.js +8 -0
  125. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-JMZX2C2C.js.map} +1 -1
  126. package/dist/ollama-adapter-GE67BNSS.js +5 -0
  127. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-GE67BNSS.js.map} +1 -1
  128. package/dist/openai-adapter-SHPLK77L.js +7 -0
  129. package/dist/{openai-adapter-XU46EN7B.js.map → openai-adapter-SHPLK77L.js.map} +1 -1
  130. package/dist/pathResolver-A6IXQQFE.js +3 -0
  131. package/dist/pathResolver-A6IXQQFE.js.map +1 -0
  132. package/dist/profile-loader-TNAXBLDX.js +162 -0
  133. package/dist/profile-loader-TNAXBLDX.js.map +1 -0
  134. package/dist/registry-3NHVCXCZ.js +6 -0
  135. package/dist/{registry-H7B3AHPQ.js.map → registry-3NHVCXCZ.js.map} +1 -1
  136. package/dist/registry-7CQ3NCAD.js +5 -0
  137. package/dist/{registry-OYWYT7WL.js.map → registry-7CQ3NCAD.js.map} +1 -1
  138. package/dist/server-manager-DES23IBQ.js +5 -0
  139. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-DES23IBQ.js.map} +1 -1
  140. package/dist/session-manager-EHD7GWM2.js +12 -0
  141. package/dist/{session-manager-NYB2RKMS.js.map → session-manager-EHD7GWM2.js.map} +1 -1
  142. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  143. package/dist/skills/built-in/commit/SKILL.md +83 -0
  144. package/dist/skills/built-in/debug/SKILL.md +119 -0
  145. package/dist/skills/built-in/plan/SKILL.md +123 -0
  146. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  147. package/dist/skills/built-in/test/SKILL.md +128 -0
  148. package/dist/sqlite-store-7ZIVOUNI.js +5 -0
  149. package/dist/sqlite-store-7ZIVOUNI.js.map +1 -0
  150. package/dist/team-manager-6DCNLGTC.js +11 -0
  151. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-6DCNLGTC.js.map} +1 -1
  152. package/dist/team-state-R2D7DT5M.js +3 -0
  153. package/dist/team-state-R2D7DT5M.js.map +1 -0
  154. package/dist/tmux-manager-WBKHUHDT.js +6 -0
  155. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-WBKHUHDT.js.map} +1 -1
  156. package/dist/tools-I6XCTEZY.js +6 -0
  157. package/dist/{tools-TSMXMHIF.js.map → tools-I6XCTEZY.js.map} +1 -1
  158. package/package.json +93 -89
  159. package/dist/App-TE3JJKOW.js +0 -2789
  160. package/dist/App-TE3JJKOW.js.map +0 -1
  161. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  162. package/dist/chunk-4IJD72YB.js.map +0 -1
  163. package/dist/chunk-6PDJ45T4.js.map +0 -1
  164. package/dist/chunk-ASGRGXYK.js.map +0 -1
  165. package/dist/chunk-CARHU3DO.js.map +0 -1
  166. package/dist/chunk-CGEV3ARR.js.map +0 -1
  167. package/dist/chunk-CS5X3BWX.js +0 -27
  168. package/dist/chunk-CS5X3BWX.js.map +0 -1
  169. package/dist/chunk-CYQNBB25.js.map +0 -1
  170. package/dist/chunk-DAHGLHNR.js.map +0 -1
  171. package/dist/chunk-H66O5Z2V.js.map +0 -1
  172. package/dist/chunk-HCIHOHLX.js.map +0 -1
  173. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  174. package/dist/chunk-I5PZ4JTS.js.map +0 -1
  175. package/dist/chunk-IYW62KKR.js.map +0 -1
  176. package/dist/chunk-JAXXTYID.js.map +0 -1
  177. package/dist/chunk-LSOYPSAT.js.map +0 -1
  178. package/dist/chunk-MFBHNWGV.js.map +0 -1
  179. package/dist/chunk-MXZSI3AY.js.map +0 -1
  180. package/dist/chunk-NBR3GHMT.js.map +0 -1
  181. package/dist/chunk-TEVZS4FA.js.map +0 -1
  182. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  183. package/dist/chunk-VUG4IZ7J.js.map +0 -1
  184. package/dist/chunk-WAHVZH7V.js +0 -260
  185. package/dist/chunk-WAHVZH7V.js.map +0 -1
  186. package/dist/chunk-WPP3PEDE.js.map +0 -1
  187. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  188. package/dist/chunk-YL5XFHR3.js.map +0 -1
  189. package/dist/chunk-ZGOHARPV.js.map +0 -1
  190. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  191. package/dist/claude-login-5WELXPKT.js.map +0 -1
  192. package/dist/codex-login-DDJBCT43.js.map +0 -1
  193. package/dist/config-store-W6FBCQAQ.js +0 -6
  194. package/dist/executor-6RIKIGXK.js +0 -4
  195. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  196. package/dist/gemini-login-YEPK6GGW.js.map +0 -1
  197. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  198. package/dist/kimi-login-ZR74MIY4.js.map +0 -1
  199. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  200. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  201. package/dist/openai-adapter-XU46EN7B.js +0 -6
  202. package/dist/registry-H7B3AHPQ.js +0 -5
  203. package/dist/registry-OYWYT7WL.js +0 -6
  204. package/dist/server-manager-PTGBHCLS.js +0 -5
  205. package/dist/session-manager-NYB2RKMS.js +0 -12
  206. package/dist/team-manager-HC4XGCFY.js +0 -11
  207. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  208. package/dist/tools-TSMXMHIF.js +0 -6
@@ -0,0 +1,230 @@
1
+ import { detectInstalledProviders } from './chunk-3TSPZRGM.js';
2
+ import { CLI_PROVIDER_ORDER, getCliProviderEntry } from './chunk-RP2TAL3J.js';
3
+ import { ConfigStore } from './chunk-5XFSV6PF.js';
4
+ import './chunk-CC7MGWYY.js';
5
+ import { PACKAGE_VERSION, DEFAULT_CONFIG } from './chunk-2GKOK6T7.js';
6
+ import './chunk-HEKFAKVH.js';
7
+ import { getConfigPath } from './chunk-BY4DAKUU.js';
8
+ import { existsSync } from 'fs';
9
+ import pc from 'picocolors';
10
+
11
+ function hasGlobalConfig() {
12
+ return existsSync(getConfigPath());
13
+ }
14
+ function isInteractiveTerminal() {
15
+ return process.stdin.isTTY && process.stdout.isTTY;
16
+ }
17
+ function createInitialConfig() {
18
+ return {
19
+ ...DEFAULT_CONFIG,
20
+ version: PACKAGE_VERSION
21
+ };
22
+ }
23
+ function ensureDefaultConfig() {
24
+ const store = new ConfigStore();
25
+ const configPath = getConfigPath();
26
+ if (hasGlobalConfig()) {
27
+ return {
28
+ configPath,
29
+ created: false,
30
+ config: store.loadGlobal()
31
+ };
32
+ }
33
+ const config = createInitialConfig();
34
+ store.saveGlobal(config);
35
+ return {
36
+ configPath,
37
+ created: true,
38
+ config
39
+ };
40
+ }
41
+ async function createFirstRunLogin(provider) {
42
+ switch (provider) {
43
+ case "claude": {
44
+ const { ClaudeLogin } = await import('./claude-login-IS5WTBMP.js');
45
+ return new ClaudeLogin();
46
+ }
47
+ case "codex": {
48
+ const { CodexLogin } = await import('./codex-login-GMPF64MR.js');
49
+ return new CodexLogin();
50
+ }
51
+ case "gemini": {
52
+ const { GeminiLogin } = await import('./gemini-login-KE224MSW.js');
53
+ return new GeminiLogin();
54
+ }
55
+ case "kimi": {
56
+ const { KimiLogin } = await import('./kimi-login-DNT5YBKX.js');
57
+ return new KimiLogin();
58
+ }
59
+ }
60
+ }
61
+ function writeWelcomeBanner() {
62
+ process.stdout.write(
63
+ [
64
+ "",
65
+ pc.cyan(" \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"),
66
+ pc.cyan(" \u2551 Welcome to AemeathCLI \u2551"),
67
+ pc.cyan(` \u2551 Multi-Model CLI Coding Tool v${PACKAGE_VERSION.padEnd(10)} \u2551`),
68
+ pc.cyan(" \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"),
69
+ "",
70
+ " Let's get you set up:",
71
+ ""
72
+ ].join("\n")
73
+ );
74
+ }
75
+ async function runFirstRunSetup(options = {}) {
76
+ const configPath = getConfigPath();
77
+ if (hasGlobalConfig() && !options.force) {
78
+ const store2 = new ConfigStore();
79
+ return {
80
+ configPath,
81
+ created: false,
82
+ config: store2.loadGlobal()
83
+ };
84
+ }
85
+ const store = new ConfigStore();
86
+ const config = createInitialConfig();
87
+ const detectedProviders = detectInstalledProviders();
88
+ if (options.defaults || !isInteractiveTerminal()) {
89
+ const defaultPrimaryMasterProvider = detectedProviders[0];
90
+ const configWithDefaults = {
91
+ ...config,
92
+ swarm: {
93
+ onboardingComplete: true,
94
+ detectedProviders,
95
+ primaryMasterProvider: defaultPrimaryMasterProvider,
96
+ fallbackMasterProviders: detectedProviders.slice(1)
97
+ }
98
+ };
99
+ store.saveGlobal(configWithDefaults);
100
+ const modeLabel = options.defaults ? "defaults" : "non-interactive defaults";
101
+ process.stdout.write(
102
+ `${pc.green("\u2713")} Saved ${modeLabel} to ${pc.cyan(configPath)}
103
+ `
104
+ );
105
+ return {
106
+ configPath,
107
+ created: true,
108
+ config: configWithDefaults
109
+ };
110
+ }
111
+ const { checkbox, confirm, select } = await import('@inquirer/prompts');
112
+ writeWelcomeBanner();
113
+ const detectedLines = CLI_PROVIDER_ORDER.map((provider) => {
114
+ const entry = getCliProviderEntry(provider);
115
+ const installed = detectedProviders.includes(provider);
116
+ return ` ${installed ? pc.green("\u2713") : pc.dim("\u25CB")} ${entry.label} \u2014 ${installed ? "installed" : "not detected"}`;
117
+ });
118
+ process.stdout.write(`${detectedLines.join("\n")}
119
+
120
+ `);
121
+ const loginChoices = CLI_PROVIDER_ORDER.map((provider) => {
122
+ const entry = getCliProviderEntry(provider);
123
+ if (entry.loginProvider === void 0) {
124
+ return void 0;
125
+ }
126
+ const installed = detectedProviders.includes(provider);
127
+ return {
128
+ name: `${entry.label}${installed ? "" : " (not detected, login only)"}`,
129
+ value: entry.loginProvider,
130
+ checked: installed && provider !== "kimi-cli"
131
+ };
132
+ }).filter((choice) => choice !== void 0);
133
+ const selectedLoginProviders = await checkbox({
134
+ message: "Which providers should be authenticated during setup?",
135
+ choices: loginChoices
136
+ });
137
+ for (const provider of selectedLoginProviders) {
138
+ process.stdout.write(pc.cyan(` Logging in to ${provider}...
139
+ `));
140
+ try {
141
+ const login = await createFirstRunLogin(provider);
142
+ await login.login();
143
+ process.stdout.write(pc.green(` \u2713 ${provider} \u2014 Logged in successfully
144
+ `));
145
+ } catch (error) {
146
+ const message = error instanceof Error ? error.message : String(error);
147
+ process.stdout.write(pc.yellow(` ! ${provider} \u2014 Login skipped: ${message}
148
+ `));
149
+ }
150
+ }
151
+ if (detectedProviders.includes("ollama")) {
152
+ process.stdout.write(pc.green(" \u2713 ollama \u2014 Local agent runtime detected\n"));
153
+ }
154
+ let primaryMasterProvider;
155
+ let fallbackMasterProviders = [];
156
+ if (detectedProviders.length > 0) {
157
+ primaryMasterProvider = await select({
158
+ message: "Choose the primary master agent provider for swarm orchestration:",
159
+ choices: detectedProviders.map((provider) => ({
160
+ name: `${getCliProviderEntry(provider).label} \u2014 ${getCliProviderEntry(provider).description}`,
161
+ value: provider
162
+ }))
163
+ });
164
+ const remainingProviders = detectedProviders.filter(
165
+ (provider) => provider !== primaryMasterProvider
166
+ );
167
+ if (remainingProviders.length > 0) {
168
+ fallbackMasterProviders = await checkbox({
169
+ message: "Select optional fallback master-agent providers:",
170
+ choices: remainingProviders.map((provider) => ({
171
+ name: `${getCliProviderEntry(provider).label} \u2014 ${getCliProviderEntry(provider).description}`,
172
+ value: provider
173
+ }))
174
+ });
175
+ }
176
+ } else {
177
+ process.stdout.write(
178
+ `${pc.yellow(" !")} No supported native agent CLIs were detected. You can still use direct chat, but swarm orchestration will stay limited until one is installed.
179
+ `
180
+ );
181
+ }
182
+ const keepRoleDefaults = await confirm({
183
+ message: "Keep the recommended role-routing defaults?",
184
+ default: true
185
+ });
186
+ const configuredProviders = {
187
+ ...config.providers
188
+ };
189
+ for (const provider of detectedProviders) {
190
+ const entry = getCliProviderEntry(provider);
191
+ configuredProviders[entry.provider] = {
192
+ ...configuredProviders[entry.provider],
193
+ enabled: true
194
+ };
195
+ }
196
+ const finalConfig = {
197
+ ...config,
198
+ roles: keepRoleDefaults ? DEFAULT_CONFIG.roles : config.roles,
199
+ providers: configuredProviders,
200
+ swarm: {
201
+ onboardingComplete: true,
202
+ detectedProviders,
203
+ primaryMasterProvider,
204
+ fallbackMasterProviders
205
+ }
206
+ };
207
+ store.saveGlobal(finalConfig);
208
+ process.stdout.write(
209
+ [
210
+ "",
211
+ ` ${pc.green("\u2713")} Configuration saved to ${pc.cyan(configPath)}`,
212
+ "",
213
+ ` Swarm primary: ${primaryMasterProvider ? getCliProviderEntry(primaryMasterProvider).label : "not set"}`,
214
+ ` Swarm fallbacks: ${fallbackMasterProviders.length > 0 ? fallbackMasterProviders.map(getCliProviderEntry).map((entry) => entry.label).join(", ") : "none"}`,
215
+ "",
216
+ " Ready. Start with `aemeathcli` or `ac`.",
217
+ " Use Shift+Tab inside the TUI to switch between swarm, guided edits, and direct chat.",
218
+ ""
219
+ ].join("\n")
220
+ );
221
+ return {
222
+ configPath,
223
+ created: true,
224
+ config: finalConfig
225
+ };
226
+ }
227
+
228
+ export { createInitialConfig, ensureDefaultConfig, hasGlobalConfig, isInteractiveTerminal, runFirstRunSetup };
229
+ //# sourceMappingURL=first-run-GDEVRFPO.js.map
230
+ //# sourceMappingURL=first-run-GDEVRFPO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/setup/first-run.ts"],"names":["store"],"mappings":"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","file":"first-run-GDEVRFPO.js","sourcesContent":["import { existsSync } from \"node:fs\";\r\n\r\nimport pc from \"picocolors\";\r\n\r\nimport type { CliProviderType } from \"../../orchestrator/constants.js\";\r\nimport { CLI_PROVIDER_ORDER, getCliProviderEntry, type LoginProvider } from \"../../orchestrator/utils/provider-catalog.js\";\r\nimport { detectInstalledProviders } from \"../../orchestrator/utils/detect-providers.js\";\r\nimport { ConfigStore } from \"../../storage/config-store.js\";\r\nimport { DEFAULT_CONFIG, type IGlobalConfig } from \"../../types/config.js\";\r\nimport { getConfigPath } from \"../../utils/pathResolver.js\";\r\nimport { PACKAGE_VERSION } from \"../../version.js\";\r\n\r\ninterface IFirstRunLogin {\r\n login(): Promise<unknown>;\r\n}\r\n\r\nexport interface FirstRunSetupOptions {\r\n readonly defaults?: boolean;\r\n readonly force?: boolean;\r\n}\r\n\r\nexport interface FirstRunSetupResult {\r\n readonly configPath: string;\r\n readonly created: boolean;\r\n readonly config: IGlobalConfig;\r\n}\r\n\r\nexport function hasGlobalConfig(): boolean {\r\n return existsSync(getConfigPath());\r\n}\r\n\r\nexport function isInteractiveTerminal(): boolean {\r\n return process.stdin.isTTY && process.stdout.isTTY;\r\n}\r\n\r\nexport function createInitialConfig(): IGlobalConfig {\r\n return {\r\n ...DEFAULT_CONFIG,\r\n version: PACKAGE_VERSION,\r\n };\r\n}\r\n\r\nexport function ensureDefaultConfig(): FirstRunSetupResult {\r\n const store = new ConfigStore();\r\n const configPath = getConfigPath();\r\n\r\n if (hasGlobalConfig()) {\r\n return {\r\n configPath,\r\n created: false,\r\n config: store.loadGlobal(),\r\n };\r\n }\r\n\r\n const config = createInitialConfig();\r\n store.saveGlobal(config);\r\n\r\n return {\r\n configPath,\r\n created: true,\r\n config,\r\n };\r\n}\r\n\r\nasync function createFirstRunLogin(provider: LoginProvider): Promise<IFirstRunLogin> {\r\n switch (provider) {\r\n case \"claude\": {\r\n const { ClaudeLogin } = await import(\"../../auth/providers/claude-login.js\");\r\n return new ClaudeLogin();\r\n }\r\n case \"codex\": {\r\n const { CodexLogin } = await import(\"../../auth/providers/codex-login.js\");\r\n return new CodexLogin();\r\n }\r\n case \"gemini\": {\r\n const { GeminiLogin } = await import(\"../../auth/providers/gemini-login.js\");\r\n return new GeminiLogin();\r\n }\r\n case \"kimi\": {\r\n const { KimiLogin } = await import(\"../../auth/providers/kimi-login.js\");\r\n return new KimiLogin();\r\n }\r\n }\r\n}\r\n\r\nfunction writeWelcomeBanner(): void {\r\n process.stdout.write(\r\n [\r\n \"\",\r\n pc.cyan(\" ╔══════════════════════════════════════════════╗\"),\r\n pc.cyan(\" ║ Welcome to AemeathCLI ║\"),\r\n pc.cyan(` ║ Multi-Model CLI Coding Tool v${PACKAGE_VERSION.padEnd(10)} ║`),\r\n pc.cyan(\" ╚══════════════════════════════════════════════╝\"),\r\n \"\",\r\n \" Let's get you set up:\",\r\n \"\",\r\n ].join(\"\\n\"),\r\n );\r\n}\r\n\r\nexport async function runFirstRunSetup(\r\n options: FirstRunSetupOptions = {},\r\n): Promise<FirstRunSetupResult> {\r\n const configPath = getConfigPath();\r\n if (hasGlobalConfig() && !options.force) {\r\n const store = new ConfigStore();\r\n return {\r\n configPath,\r\n created: false,\r\n config: store.loadGlobal(),\r\n };\r\n }\r\n\r\n const store = new ConfigStore();\r\n const config = createInitialConfig();\r\n const detectedProviders = detectInstalledProviders();\r\n\r\n if (options.defaults || !isInteractiveTerminal()) {\r\n const defaultPrimaryMasterProvider = detectedProviders[0];\r\n const configWithDefaults: IGlobalConfig = {\r\n ...config,\r\n swarm: {\r\n onboardingComplete: true,\r\n detectedProviders,\r\n primaryMasterProvider: defaultPrimaryMasterProvider,\r\n fallbackMasterProviders: detectedProviders.slice(1),\r\n },\r\n };\r\n store.saveGlobal(configWithDefaults);\r\n\r\n const modeLabel = options.defaults ? \"defaults\" : \"non-interactive defaults\";\r\n process.stdout.write(\r\n `${pc.green(\"✓\")} Saved ${modeLabel} to ${pc.cyan(configPath)}\\n`,\r\n );\r\n\r\n return {\r\n configPath,\r\n created: true,\r\n config: configWithDefaults,\r\n };\r\n }\r\n\r\n const { checkbox, confirm, select } = await import(\"@inquirer/prompts\");\r\n\r\n writeWelcomeBanner();\r\n\r\n const detectedLines = CLI_PROVIDER_ORDER.map((provider) => {\r\n const entry = getCliProviderEntry(provider);\r\n const installed = detectedProviders.includes(provider);\r\n return ` ${installed ? pc.green(\"✓\") : pc.dim(\"○\")} ${entry.label} — ${installed ? \"installed\" : \"not detected\"}`;\r\n });\r\n process.stdout.write(`${detectedLines.join(\"\\n\")}\\n\\n`);\r\n\r\n const loginChoices = CLI_PROVIDER_ORDER\r\n .map((provider) => {\r\n const entry = getCliProviderEntry(provider);\r\n if (entry.loginProvider === undefined) {\r\n return undefined;\r\n }\r\n\r\n const installed = detectedProviders.includes(provider);\r\n return {\r\n name: `${entry.label}${installed ? \"\" : \" (not detected, login only)\"}`,\r\n value: entry.loginProvider,\r\n checked: installed && provider !== \"kimi-cli\",\r\n };\r\n })\r\n .filter((choice): choice is { name: string; value: LoginProvider; checked: boolean } => choice !== undefined);\r\n\r\n const selectedLoginProviders = await checkbox<LoginProvider>({\r\n message: \"Which providers should be authenticated during setup?\",\r\n choices: loginChoices,\r\n });\r\n\r\n for (const provider of selectedLoginProviders) {\r\n process.stdout.write(pc.cyan(` Logging in to ${provider}...\\n`));\r\n try {\r\n const login = await createFirstRunLogin(provider);\r\n await login.login();\r\n process.stdout.write(pc.green(` ✓ ${provider} — Logged in successfully\\n`));\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n process.stdout.write(pc.yellow(` ! ${provider} — Login skipped: ${message}\\n`));\r\n }\r\n }\r\n\r\n if (detectedProviders.includes(\"ollama\")) {\r\n process.stdout.write(pc.green(\" ✓ ollama — Local agent runtime detected\\n\"));\r\n }\r\n\r\n let primaryMasterProvider: CliProviderType | undefined;\r\n let fallbackMasterProviders: CliProviderType[] = [];\r\n\r\n if (detectedProviders.length > 0) {\r\n primaryMasterProvider = await select<CliProviderType>({\r\n message: \"Choose the primary master agent provider for swarm orchestration:\",\r\n choices: detectedProviders.map((provider) => ({\r\n name: `${getCliProviderEntry(provider).label} — ${getCliProviderEntry(provider).description}`,\r\n value: provider,\r\n })),\r\n });\r\n\r\n const remainingProviders = detectedProviders.filter(\r\n (provider) => provider !== primaryMasterProvider,\r\n );\r\n\r\n if (remainingProviders.length > 0) {\r\n fallbackMasterProviders = await checkbox<CliProviderType>({\r\n message: \"Select optional fallback master-agent providers:\",\r\n choices: remainingProviders.map((provider) => ({\r\n name: `${getCliProviderEntry(provider).label} — ${getCliProviderEntry(provider).description}`,\r\n value: provider,\r\n })),\r\n });\r\n }\r\n } else {\r\n process.stdout.write(\r\n `${pc.yellow(\" !\")} No supported native agent CLIs were detected. You can still use direct chat, but swarm orchestration will stay limited until one is installed.\\n`,\r\n );\r\n }\r\n\r\n const keepRoleDefaults = await confirm({\r\n message: \"Keep the recommended role-routing defaults?\",\r\n default: true,\r\n });\r\n\r\n const configuredProviders: IGlobalConfig[\"providers\"] = {\r\n ...config.providers,\r\n };\r\n for (const provider of detectedProviders) {\r\n const entry = getCliProviderEntry(provider);\r\n configuredProviders[entry.provider] = {\r\n ...configuredProviders[entry.provider],\r\n enabled: true,\r\n };\r\n }\r\n\r\n const finalConfig: IGlobalConfig = {\r\n ...config,\r\n roles: keepRoleDefaults ? DEFAULT_CONFIG.roles : config.roles,\r\n providers: configuredProviders,\r\n swarm: {\r\n onboardingComplete: true,\r\n detectedProviders,\r\n primaryMasterProvider,\r\n fallbackMasterProviders,\r\n },\r\n };\r\n\r\n store.saveGlobal(finalConfig);\r\n\r\n process.stdout.write(\r\n [\r\n \"\",\r\n ` ${pc.green(\"✓\")} Configuration saved to ${pc.cyan(configPath)}`,\r\n \"\",\r\n ` Swarm primary: ${primaryMasterProvider ? getCliProviderEntry(primaryMasterProvider).label : \"not set\"}`,\r\n ` Swarm fallbacks: ${fallbackMasterProviders.length > 0 ? fallbackMasterProviders.map(getCliProviderEntry).map((entry) => entry.label).join(\", \") : \"none\"}`,\r\n \"\",\r\n \" Ready. Start with `aemeathcli` or `ac`.\",\r\n \" Use Shift+Tab inside the TUI to switch between swarm, guided edits, and direct chat.\",\r\n \"\",\r\n ].join(\"\\n\"),\r\n );\r\n\r\n return {\r\n configPath,\r\n created: true,\r\n config: finalConfig,\r\n };\r\n}\r\n"]}
@@ -0,0 +1,7 @@
1
+ export { GeminiAdapter } from './chunk-25UNNEHN.js';
2
+ import './chunk-ODBY7S4X.js';
3
+ import './chunk-473JN6M5.js';
4
+ import './chunk-62HSGYQD.js';
5
+ import './chunk-HEKFAKVH.js';
6
+ //# sourceMappingURL=gemini-adapter-MV3U4QFH.js.map
7
+ //# sourceMappingURL=gemini-adapter-MV3U4QFH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"gemini-adapter-6JIHZ7WI.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"gemini-adapter-MV3U4QFH.js"}
@@ -1,11 +1,11 @@
1
- import { CredentialStore } from './chunk-4IJD72YB.js';
2
- import './chunk-CGEV3ARR.js';
3
- import './chunk-CYQNBB25.js';
4
- import './chunk-NBR3GHMT.js';
5
- import './chunk-CS5X3BWX.js';
6
- import './chunk-HCIHOHLX.js';
7
- import { AuthenticationError } from './chunk-ZGOHARPV.js';
8
- import { logger } from './chunk-JAXXTYID.js';
1
+ import { CredentialStore } from './chunk-AQ23TYSQ.js';
2
+ import './chunk-VJNQJALF.js';
3
+ import './chunk-VBLLDY4R.js';
4
+ import './chunk-2GKOK6T7.js';
5
+ import { AuthenticationError } from './chunk-473JN6M5.js';
6
+ import './chunk-62HSGYQD.js';
7
+ import { logger } from './chunk-HEKFAKVH.js';
8
+ import './chunk-BY4DAKUU.js';
9
9
  import { statSync, existsSync, readFileSync } from 'fs';
10
10
  import { join } from 'path';
11
11
  import { homedir } from 'os';
@@ -220,15 +220,14 @@ var GeminiLogin = class {
220
220
  }
221
221
  async isCliAvailable() {
222
222
  try {
223
- await execa(CLI_COMMAND, ["--help"], { timeout: 5e3, stdin: "ignore", stdout: "ignore", stderr: "ignore" });
223
+ await execa(CLI_COMMAND, ["--version"], { timeout: 5e3, stdin: "ignore", stdout: "ignore", stderr: "ignore" });
224
224
  return true;
225
- } catch (error) {
226
- const code = error.code;
227
- return code !== "ENOENT";
225
+ } catch {
226
+ return false;
228
227
  }
229
228
  }
230
229
  };
231
230
 
232
231
  export { GeminiLogin };
233
- //# sourceMappingURL=gemini-login-YEPK6GGW.js.map
234
- //# sourceMappingURL=gemini-login-YEPK6GGW.js.map
232
+ //# sourceMappingURL=gemini-login-KE224MSW.js.map
233
+ //# sourceMappingURL=gemini-login-KE224MSW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/providers/gemini-login.ts"],"names":[],"mappings":"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","file":"gemini-login-KE224MSW.js","sourcesContent":["/**\r\n * Gemini (Google) delegated authentication\r\n * Reads cached credentials from ~/.gemini/oauth_creds.json (shared with the Gemini CLI).\r\n * If not authenticated, opens a new terminal window running `gemini` for interactive login,\r\n * then polls for credentials to appear.\r\n */\r\n\r\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\nimport { execa } from \"execa\";\r\nimport type { ICredential } from \"../../types/index.js\";\r\nimport { AuthenticationError } from \"../../types/index.js\";\r\nimport { CredentialStore } from \"../credential-store.js\";\r\nimport { logger } from \"../../utils/index.js\";\r\n\r\n// ── Gemini CLI Token Paths ──────────────────────────────────────────────\r\n\r\nconst CLI_COMMAND = \"gemini\";\r\nconst LOGIN_POLL_INTERVAL_MS = 2_000;\r\nconst LOGIN_POLL_TIMEOUT_MS = 120_000;\r\n\r\nfunction getGeminiHome(): string {\r\n return process.env[\"GEMINI_HOME\"] ?? join(homedir(), \".gemini\");\r\n}\r\n\r\nfunction getOAuthCredsPath(): string {\r\n return join(getGeminiHome(), \"oauth_creds.json\");\r\n}\r\n\r\nfunction getGoogleAccountsPath(): string {\r\n return join(getGeminiHome(), \"google_accounts.json\");\r\n}\r\n\r\n// ── Read existing tokens from Gemini CLI cache ──────────────────────────\r\n\r\ninterface IGeminiOAuthCreds {\r\n readonly access_token?: string;\r\n readonly scope?: string;\r\n readonly token_type?: string;\r\n readonly id_token?: string;\r\n readonly expiry_date?: number;\r\n readonly refresh_token?: string;\r\n}\r\n\r\ninterface IGoogleAccounts {\r\n readonly active?: string;\r\n}\r\n\r\nfunction readOAuthCreds(): IGeminiOAuthCreds | undefined {\r\n const credsPath = getOAuthCredsPath();\r\n if (!existsSync(credsPath)) return undefined;\r\n try {\r\n return JSON.parse(readFileSync(credsPath, \"utf-8\")) as IGeminiOAuthCreds;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction readGoogleAccounts(): IGoogleAccounts | undefined {\r\n const accountsPath = getGoogleAccountsPath();\r\n if (!existsSync(accountsPath)) return undefined;\r\n try {\r\n return JSON.parse(readFileSync(accountsPath, \"utf-8\")) as IGoogleAccounts;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction getCredsMtime(): number {\r\n const credsPath = getOAuthCredsPath();\r\n try {\r\n return statSync(credsPath).mtimeMs;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction extractEmailFromIdToken(idToken: string): string | undefined {\r\n try {\r\n const payload = idToken.split(\".\")[1];\r\n if (!payload) return undefined;\r\n const decoded = JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as { email?: string };\r\n return decoded.email;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n// ── Open a new terminal window cross-platform ───────────────────────────\r\n\r\nasync function openTerminalWithGemini(): Promise<void> {\r\n const platform = process.platform;\r\n\r\n if (platform === \"win32\") {\r\n // Windows: open a new PowerShell window running gemini\r\n await execa(\"cmd\", [\"/c\", \"start\", \"powershell\", \"-NoExit\", \"-Command\", \"gemini\"], {\r\n stdin: \"ignore\",\r\n stdout: \"ignore\",\r\n stderr: \"ignore\",\r\n });\r\n } else if (platform === \"darwin\") {\r\n // macOS: open a new Terminal.app window running gemini\r\n await execa(\"osascript\", [\r\n \"-e\",\r\n 'tell application \"Terminal\" to do script \"gemini\"',\r\n \"-e\",\r\n 'tell application \"Terminal\" to activate',\r\n ], {\r\n stdin: \"ignore\",\r\n stdout: \"ignore\",\r\n stderr: \"ignore\",\r\n });\r\n } else {\r\n // Linux: try common terminal emulators\r\n const terminals = [\r\n { cmd: \"gnome-terminal\", args: [\"--\", \"gemini\"] },\r\n { cmd: \"konsole\", args: [\"-e\", \"gemini\"] },\r\n { cmd: \"xfce4-terminal\", args: [\"-e\", \"gemini\"] },\r\n { cmd: \"xterm\", args: [\"-e\", \"gemini\"] },\r\n ];\r\n\r\n for (const terminal of terminals) {\r\n try {\r\n await execa(terminal.cmd, terminal.args, {\r\n stdin: \"ignore\",\r\n stdout: \"ignore\",\r\n stderr: \"ignore\",\r\n detached: true,\r\n });\r\n return;\r\n } catch {\r\n // Try next terminal\r\n }\r\n }\r\n\r\n throw new Error(\"Could not find a terminal emulator. Please run `gemini` manually in a separate terminal.\");\r\n }\r\n}\r\n\r\n// ── GeminiLogin Class ───────────────────────────────────────────────────\r\n\r\nexport class GeminiLogin {\r\n private readonly credentialStore: CredentialStore;\r\n\r\n constructor(store?: CredentialStore) {\r\n this.credentialStore = store ?? new CredentialStore();\r\n }\r\n\r\n /**\r\n * Attempt to import credentials from the Gemini CLI cache.\r\n * If not found, opens a new terminal window running `gemini` for interactive\r\n * login, then polls for credentials to appear in ~/.gemini/oauth_creds.json.\r\n */\r\n async login(): Promise<ICredential> {\r\n // Try importing existing credentials from Gemini CLI's cache\r\n const existing = this.readCachedCredential();\r\n if (existing) {\r\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\r\n if (!isExpired) {\r\n logger.info(\"Found existing Gemini CLI credentials in ~/.gemini/oauth_creds.json\");\r\n await this.credentialStore.set(\"google\", existing);\r\n return existing;\r\n }\r\n }\r\n\r\n // Check if the CLI is installed\r\n const cliAvailable = await this.isCliAvailable();\r\n\r\n if (!cliAvailable) {\r\n throw new AuthenticationError(\r\n \"google\",\r\n \"Gemini CLI not found. Install it first:\\n\" +\r\n \" npm install -g @google/gemini-cli\\n\" +\r\n \"Then retry /login.\",\r\n );\r\n }\r\n\r\n // Record the current mtime so we can detect new credentials\r\n const beforeMtime = getCredsMtime();\r\n\r\n // Open a new terminal window running gemini for interactive login\r\n logger.info(\"Opening new terminal window for Gemini login\");\r\n try {\r\n await openTerminalWithGemini();\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n throw new AuthenticationError(\"google\", msg);\r\n }\r\n\r\n // Poll for credentials to appear (user authenticates in the other window)\r\n const credential = await this.pollForCredentials(beforeMtime);\r\n if (!credential) {\r\n throw new AuthenticationError(\r\n \"google\",\r\n \"Login timed out. Please complete authentication in the Gemini terminal, then retry /login.\",\r\n );\r\n }\r\n\r\n await this.credentialStore.set(\"google\", credential);\r\n logger.info(\"Gemini credentials imported successfully\");\r\n return credential;\r\n }\r\n\r\n async logout(): Promise<void> {\r\n await this.credentialStore.delete(\"google\");\r\n logger.info(\"Google session revoked from AemeathCLI\");\r\n }\r\n\r\n async isLoggedIn(): Promise<boolean> {\r\n const credential = this.readCachedCredential();\r\n if (!credential) return false;\r\n if (credential.expiresAt && new Date() > credential.expiresAt && credential.refreshToken === undefined) {\r\n return false;\r\n }\r\n\r\n await this.credentialStore.set(\"google\", credential);\r\n return true;\r\n }\r\n\r\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\r\n const loggedIn = await this.isLoggedIn();\r\n if (!loggedIn) return { loggedIn: false };\r\n\r\n const credential = await this.credentialStore.get(\"google\");\r\n if (!credential) return { loggedIn: false };\r\n\r\n return {\r\n loggedIn: true,\r\n ...(credential.email !== undefined ? { email: credential.email } : {}),\r\n plan: \"Google AI\",\r\n };\r\n }\r\n\r\n async getCachedCredential(): Promise<ICredential | undefined> {\r\n const credential = this.readCachedCredential();\r\n if (credential) {\r\n await this.credentialStore.set(\"google\", credential);\r\n }\r\n return credential;\r\n }\r\n\r\n // ── Internal ──────────────────────────────────────────────────────────\r\n\r\n private readCachedCredential(): ICredential | undefined {\r\n const oauthCreds = readOAuthCreds();\r\n if (!oauthCreds?.access_token) return undefined;\r\n\r\n let email: string | undefined;\r\n const accounts = readGoogleAccounts();\r\n if (accounts?.active) {\r\n email = accounts.active;\r\n } else if (oauthCreds.id_token) {\r\n email = extractEmailFromIdToken(oauthCreds.id_token);\r\n }\r\n\r\n const expiresAt = oauthCreds.expiry_date ? new Date(oauthCreds.expiry_date) : undefined;\r\n\r\n return {\r\n provider: \"google\",\r\n method: \"native_login\",\r\n token: oauthCreds.access_token,\r\n ...(oauthCreds.refresh_token !== undefined ? { refreshToken: oauthCreds.refresh_token } : {}),\r\n ...(expiresAt !== undefined ? { expiresAt } : {}),\r\n ...(email !== undefined ? { email } : {}),\r\n plan: \"Google AI\",\r\n };\r\n }\r\n\r\n /**\r\n * Poll for new credentials to appear in ~/.gemini/oauth_creds.json.\r\n * Detects new credentials by checking if the file mtime changed from beforeMtime.\r\n */\r\n private async pollForCredentials(beforeMtime: number): Promise<ICredential | undefined> {\r\n const deadline = Date.now() + LOGIN_POLL_TIMEOUT_MS;\r\n\r\n while (Date.now() < deadline) {\r\n await sleep(LOGIN_POLL_INTERVAL_MS);\r\n\r\n const currentMtime = getCredsMtime();\r\n if (currentMtime > beforeMtime) {\r\n const credential = this.readCachedCredential();\r\n if (credential) return credential;\r\n }\r\n }\r\n\r\n // One final check\r\n return this.readCachedCredential() ?? undefined;\r\n }\r\n\r\n private async isCliAvailable(): Promise<boolean> {\r\n try {\r\n await execa(CLI_COMMAND, [\"--version\"], { timeout: 5000, stdin: \"ignore\", stdout: \"ignore\", stderr: \"ignore\" });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
package/dist/index.d.ts CHANGED
@@ -51,6 +51,7 @@ interface IChatMessage {
51
51
  readonly model?: string | undefined;
52
52
  readonly provider?: ProviderName | undefined;
53
53
  readonly toolCalls?: readonly IToolCall[] | undefined;
54
+ readonly toolCallId?: string | undefined;
54
55
  readonly tokenUsage?: ITokenUsage | undefined;
55
56
  readonly createdAt: Date;
56
57
  }
@@ -94,7 +95,7 @@ interface IToolParameter {
94
95
  readonly type: string;
95
96
  readonly description: string;
96
97
  readonly required: boolean;
97
- readonly default?: unknown | undefined;
98
+ readonly default?: unknown;
98
99
  readonly enum?: readonly string[] | undefined;
99
100
  }
100
101
  interface IToolDefinition {
@@ -123,8 +124,8 @@ type ToolCategory = "file" | "search" | "shell" | "web" | "git" | "mcp";
123
124
  interface IToolRegistration {
124
125
  readonly definition: IToolDefinition;
125
126
  readonly category: ToolCategory;
126
- readonly requiresApproval: (mode: PermissionMode, args: Record<string, unknown>) => boolean;
127
- readonly execute: (args: Record<string, unknown>) => Promise<IToolResult>;
127
+ readonly requiresApproval: (context: IToolExecutionContext, args: Record<string, unknown>) => boolean;
128
+ readonly execute: (args: Record<string, unknown>, context: IToolExecutionContext) => Promise<IToolResult>;
128
129
  }
129
130
  interface IToolExecutionContext {
130
131
  readonly workingDirectory: string;
@@ -189,7 +190,7 @@ interface IIPCMessage {
189
190
  readonly params: Record<string, unknown>;
190
191
  readonly id?: number | undefined;
191
192
  }
192
- type PaneLayout = "auto" | "horizontal" | "vertical" | "grid";
193
+ type PaneLayout = "auto" | "horizontal" | "vertical" | "grid" | "hub-spoke";
193
194
  interface IPaneConfig {
194
195
  readonly paneId: string;
195
196
  readonly agentName: string;
@@ -203,6 +204,12 @@ interface ILayoutConfig {
203
204
  readonly maxPanes: number;
204
205
  }
205
206
 
207
+ /**
208
+ * Orchestrator constants — shared across all orchestrator modules.
209
+ */
210
+
211
+ type CliProviderType = "claude-code" | "codex" | "gemini-cli" | "kimi-cli" | "ollama";
212
+
206
213
  /**
207
214
  * Configuration types per PRD section 17.3
208
215
  */
@@ -223,6 +230,12 @@ interface ISplitPanelConfig {
223
230
  readonly defaultLayout: PaneLayout;
224
231
  readonly maxPanes: number;
225
232
  }
233
+ interface ISwarmConfig {
234
+ readonly onboardingComplete: boolean;
235
+ readonly detectedProviders: readonly CliProviderType[];
236
+ readonly primaryMasterProvider?: CliProviderType | undefined;
237
+ readonly fallbackMasterProviders: readonly CliProviderType[];
238
+ }
226
239
  interface ICostConfig {
227
240
  readonly budgetWarning: number;
228
241
  readonly budgetHardStop: number;
@@ -252,6 +265,7 @@ interface IGlobalConfig {
252
265
  readonly providers: Partial<Record<ProviderName, IProviderConfig>>;
253
266
  readonly permissions: IPermissionConfig;
254
267
  readonly splitPanel: ISplitPanelConfig;
268
+ readonly swarm: ISwarmConfig;
255
269
  readonly cost: ICostConfig;
256
270
  readonly telemetry: ITelemetryConfig;
257
271
  readonly oauth?: IOAuthConfig | undefined;
@@ -801,6 +815,7 @@ declare class TaskOrchestrator {
801
815
  interface IModelProvider {
802
816
  readonly name: string;
803
817
  readonly supportedModels: readonly string[];
818
+ readonly supportsToolCalling: boolean;
804
819
  /** Send a non-streaming chat request. */
805
820
  chat(request: IChatRequest): Promise<IChatResponse>;
806
821
  /** Send a streaming chat request returning an async iterable of chunks. */
@@ -885,6 +900,7 @@ declare class ProviderRegistry {
885
900
  declare class ClaudeAdapter implements IModelProvider {
886
901
  readonly name: ProviderName;
887
902
  readonly supportedModels: readonly string[];
903
+ readonly supportsToolCalling = true;
888
904
  private readonly anthropic;
889
905
  constructor(options?: IProviderOptions);
890
906
  chat(request: IChatRequest): Promise<IChatResponse>;
@@ -901,6 +917,7 @@ declare class ClaudeAdapter implements IModelProvider {
901
917
  declare class OpenAIAdapter implements IModelProvider {
902
918
  readonly name: ProviderName;
903
919
  readonly supportedModels: readonly string[];
920
+ readonly supportsToolCalling = true;
904
921
  private readonly openai;
905
922
  private readonly apiKey;
906
923
  private readonly baseUrl;
@@ -920,6 +937,7 @@ declare class OpenAIAdapter implements IModelProvider {
920
937
  declare class GeminiAdapter implements IModelProvider {
921
938
  readonly name: ProviderName;
922
939
  readonly supportedModels: readonly string[];
940
+ readonly supportsToolCalling = true;
923
941
  private readonly google;
924
942
  constructor(options?: IProviderOptions);
925
943
  chat(request: IChatRequest): Promise<IChatResponse>;
@@ -937,6 +955,7 @@ declare class GeminiAdapter implements IModelProvider {
937
955
  declare class KimiAdapter implements IModelProvider {
938
956
  readonly name: ProviderName;
939
957
  readonly supportedModels: readonly string[];
958
+ readonly supportsToolCalling = true;
940
959
  private readonly baseUrl;
941
960
  private readonly apiKey;
942
961
  constructor(options?: IProviderOptions);
@@ -956,6 +975,7 @@ declare class KimiAdapter implements IModelProvider {
956
975
 
957
976
  declare class OllamaAdapter implements IModelProvider {
958
977
  readonly name: ProviderName;
978
+ readonly supportsToolCalling = true;
959
979
  private readonly baseUrl;
960
980
  private cachedModels;
961
981
  constructor(options?: IProviderOptions);
@@ -987,7 +1007,8 @@ interface ICLIResult {
987
1007
  declare abstract class BaseNativeCLIAdapter implements IModelProvider {
988
1008
  abstract readonly name: ProviderName;
989
1009
  abstract readonly supportedModels: readonly string[];
990
- protected abstract runCLI(model: string, prompt: string): Promise<ICLIResult>;
1010
+ readonly supportsToolCalling = false;
1011
+ protected abstract runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;
991
1012
  chat(request: IChatRequest): Promise<IChatResponse>;
992
1013
  stream(request: IChatRequest): AsyncIterable<IStreamChunk>;
993
1014
  countTokens(text: string, _model: string): Promise<number>;
@@ -997,22 +1018,24 @@ declare abstract class BaseNativeCLIAdapter implements IModelProvider {
997
1018
  declare class ClaudeNativeCLIAdapter extends BaseNativeCLIAdapter {
998
1019
  readonly name: ProviderName;
999
1020
  readonly supportedModels: readonly ["claude-opus-4-6", "claude-opus-4-6-1m", "claude-sonnet-4-6", "claude-sonnet-4-6-1m", "claude-haiku-4-5"];
1000
- protected runCLI(model: string, prompt: string): Promise<ICLIResult>;
1021
+ /** Map internal model IDs to valid Claude CLI model IDs. */
1022
+ private toCLIModelId;
1023
+ protected runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;
1001
1024
  }
1002
1025
  declare class CodexNativeCLIAdapter extends BaseNativeCLIAdapter {
1003
1026
  readonly name: ProviderName;
1004
1027
  readonly supportedModels: readonly ["gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.2-codex", "gpt-5.1-codex-max", "gpt-5.2", "gpt-5.1-codex-mini"];
1005
- protected runCLI(model: string, prompt: string): Promise<ICLIResult>;
1028
+ protected runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;
1006
1029
  }
1007
1030
  declare class GeminiNativeCLIAdapter extends BaseNativeCLIAdapter {
1008
1031
  readonly name: ProviderName;
1009
1032
  readonly supportedModels: readonly ["gemini-3-pro-preview", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"];
1010
- protected runCLI(model: string, prompt: string): Promise<ICLIResult>;
1033
+ protected runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;
1011
1034
  }
1012
1035
  declare class KimiNativeCLIAdapter extends BaseNativeCLIAdapter {
1013
1036
  readonly name: ProviderName;
1014
1037
  readonly supportedModels: readonly ["kimi-for-coding"];
1015
- protected runCLI(_model: string, prompt: string): Promise<ICLIResult>;
1038
+ protected runCLI(_model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;
1016
1039
  }
1017
1040
 
1018
1041
  /**
@@ -1036,7 +1059,7 @@ declare class ToolRegistry implements IToolRegistry {
1036
1059
  * Per PRD section 5.1
1037
1060
  */
1038
1061
 
1039
- declare function createDefaultRegistry(context: IToolExecutionContext): ToolRegistry;
1062
+ declare function createDefaultRegistry(_context: IToolExecutionContext): ToolRegistry;
1040
1063
 
1041
1064
  /**
1042
1065
  * Credential storage per PRD section 13.6
@@ -1134,8 +1157,8 @@ declare class SqliteStore {
1134
1157
  private runMigrations;
1135
1158
  prepare(sql: string): Database.Statement;
1136
1159
  run(sql: string, ...params: readonly unknown[]): Database.RunResult;
1137
- get<T>(sql: string, ...params: readonly unknown[]): T | undefined;
1138
- all<T>(sql: string, ...params: readonly unknown[]): T[];
1160
+ get(sql: string, ...params: unknown[]): unknown;
1161
+ all(sql: string, ...params: unknown[]): unknown[];
1139
1162
  transaction<T>(fn: () => T): T;
1140
1163
  close(): void;
1141
1164
  private registerCleanupHandlers;
@@ -1436,11 +1459,12 @@ interface ITeamCreateOptions {
1436
1459
  readonly agents: readonly IAgentDefinition[];
1437
1460
  readonly sessionId?: string;
1438
1461
  readonly cliEntryPoint?: string;
1462
+ readonly agentEnv?: Readonly<Record<string, string>>;
1439
1463
  }
1440
1464
  declare class TeamManager {
1441
1465
  private readonly activeTeams;
1442
1466
  /** Create a new team: config, directories, and agent process handles. */
1443
- createTeam(name: string, options: ITeamCreateOptions): Promise<ITeamConfig>;
1467
+ createTeam(name: string, options: ITeamCreateOptions): ITeamConfig;
1444
1468
  /** Start all agent processes for a team. */
1445
1469
  startAgents(teamName: string): Promise<void>;
1446
1470
  /** Gracefully shutdown and remove a team. */
@@ -1506,6 +1530,7 @@ declare class AgentProcess {
1506
1530
  constructor(config: IAgentConfig, options: IAgentProcessOptions);
1507
1531
  /** Spawn the child process. Throws AgentSpawnError on failure. */
1508
1532
  start(): Promise<void>;
1533
+ private buildChildEnv;
1509
1534
  /** Gracefully stop the agent. Falls back to SIGTERM after timeout. */
1510
1535
  stop(): Promise<void>;
1511
1536
  /** Kill and restart the agent process. */
@@ -1593,6 +1618,7 @@ declare class LayoutEngine {
1593
1618
  * Compute per-pane geometries based on layout type.
1594
1619
  */
1595
1620
  private computeGeometries;
1621
+ private computeHubSpokeLayout;
1596
1622
  /**
1597
1623
  * Horizontal split: all panes side by side.
1598
1624
  */
@@ -1696,10 +1722,11 @@ declare class TmuxManager {
1696
1722
  getPanes(): ReadonlyMap<string, ITmuxPaneInfo>;
1697
1723
  private splitPane;
1698
1724
  private getFirstPaneId;
1699
- private equalizeLayout;
1725
+ private applyLayoutPreset;
1700
1726
  private killSessionSilent;
1701
1727
  private assertNotDisposed;
1702
1728
  private assertSession;
1729
+ private requireSessionName;
1703
1730
  }
1704
1731
 
1705
1732
  /**
@@ -1764,7 +1791,7 @@ declare class ITerm2Manager {
1764
1791
  * JSON-RPC 2.0 protocol with HMAC authentication per PRD section 9.4 & 14.5.
1765
1792
  */
1766
1793
 
1767
- type MethodHandler = (clientId: string, params: Record<string, unknown>, id: number | undefined, socket: Socket) => Promise<unknown>;
1794
+ type MethodHandler = (clientId: string, params: Record<string, unknown>, id: number | undefined, socket: Socket) => unknown;
1768
1795
  declare class IPCHub {
1769
1796
  private readonly sessionId;
1770
1797
  private readonly hmacSecret;
@@ -1787,7 +1814,7 @@ declare class IPCHub {
1787
1814
  /** Register a custom method handler. */
1788
1815
  onMethod(method: string, handler: MethodHandler): void;
1789
1816
  /** Compute HMAC-SHA256 for a message. */
1790
- computeHmac(message: IIPCMessage): string;
1817
+ computeHmac(message: unknown): string;
1791
1818
  /** Register a connected socket as a client (also called by agent.register). */
1792
1819
  registerClientSocket(agentId: string, agentName: string, socket: Socket): void;
1793
1820
  /** Gracefully shut down the hub and all connections. */
@@ -1797,6 +1824,8 @@ declare class IPCHub {
1797
1824
  private registerDefaultHandlers;
1798
1825
  private verifyHmac;
1799
1826
  private isAuthEnvelope;
1827
+ private isIPCMessage;
1828
+ private getRequestId;
1800
1829
  private write;
1801
1830
  private sendResult;
1802
1831
  private sendError;
@@ -1820,6 +1849,7 @@ interface IPaneProcessOptions {
1820
1849
  }
1821
1850
  type MessageHandler = (message: IIPCMessage) => void;
1822
1851
  declare class PaneProcess {
1852
+ private static readonly resolvedPromise;
1823
1853
  private readonly agentId;
1824
1854
  private readonly agentName;
1825
1855
  private readonly socketPath;
@@ -1903,7 +1933,7 @@ declare class SkillLoader {
1903
1933
  * Progressive loading: only name + description loaded initially (~100 tokens each).
1904
1934
  */
1905
1935
 
1906
- type SkillSource = "project" | "user" | "built-in";
1936
+ type SkillSource = "project" | "user" | "universal" | "built-in";
1907
1937
  interface ISkillSummary {
1908
1938
  readonly name: string;
1909
1939
  readonly description: string;