@intrect/openswarm 0.4.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/README.md +46 -26
  2. package/config.example.yaml +22 -10
  3. package/dist/adapters/agenticLoop.d.ts +45 -2
  4. package/dist/adapters/agenticLoop.d.ts.map +1 -1
  5. package/dist/adapters/agenticLoop.js +209 -61
  6. package/dist/adapters/agenticLoop.js.map +1 -1
  7. package/dist/adapters/chatStream.d.ts +55 -0
  8. package/dist/adapters/chatStream.d.ts.map +1 -0
  9. package/dist/adapters/chatStream.js +116 -0
  10. package/dist/adapters/chatStream.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +7 -0
  12. package/dist/adapters/codex.d.ts.map +1 -1
  13. package/dist/adapters/codex.js +67 -6
  14. package/dist/adapters/codex.js.map +1 -1
  15. package/dist/adapters/codexModels.d.ts +20 -0
  16. package/dist/adapters/codexModels.d.ts.map +1 -0
  17. package/dist/adapters/codexModels.js +195 -0
  18. package/dist/adapters/codexModels.js.map +1 -0
  19. package/dist/adapters/codexResponses.d.ts +97 -0
  20. package/dist/adapters/codexResponses.d.ts.map +1 -0
  21. package/dist/adapters/codexResponses.js +302 -0
  22. package/dist/adapters/codexResponses.js.map +1 -0
  23. package/dist/adapters/gpt.d.ts.map +1 -1
  24. package/dist/adapters/gpt.js +20 -120
  25. package/dist/adapters/gpt.js.map +1 -1
  26. package/dist/adapters/index.d.ts +10 -2
  27. package/dist/adapters/index.d.ts.map +1 -1
  28. package/dist/adapters/index.js +19 -5
  29. package/dist/adapters/index.js.map +1 -1
  30. package/dist/adapters/lmstudio.d.ts +8 -0
  31. package/dist/adapters/lmstudio.d.ts.map +1 -0
  32. package/dist/adapters/lmstudio.js +41 -0
  33. package/dist/adapters/lmstudio.js.map +1 -0
  34. package/dist/adapters/local.d.ts +16 -1
  35. package/dist/adapters/local.d.ts.map +1 -1
  36. package/dist/adapters/local.js +51 -127
  37. package/dist/adapters/local.js.map +1 -1
  38. package/dist/adapters/openrouter.d.ts +37 -0
  39. package/dist/adapters/openrouter.d.ts.map +1 -0
  40. package/dist/adapters/openrouter.js +193 -0
  41. package/dist/adapters/openrouter.js.map +1 -0
  42. package/dist/adapters/resultParsing.d.ts +6 -0
  43. package/dist/adapters/resultParsing.d.ts.map +1 -0
  44. package/dist/adapters/resultParsing.js +139 -0
  45. package/dist/adapters/resultParsing.js.map +1 -0
  46. package/dist/adapters/tools.d.ts +21 -2
  47. package/dist/adapters/tools.d.ts.map +1 -1
  48. package/dist/adapters/tools.js +153 -12
  49. package/dist/adapters/tools.js.map +1 -1
  50. package/dist/adapters/types.d.ts +40 -1
  51. package/dist/adapters/types.d.ts.map +1 -1
  52. package/dist/adapters/webTools.d.ts +9 -0
  53. package/dist/adapters/webTools.d.ts.map +1 -0
  54. package/dist/adapters/webTools.js +195 -0
  55. package/dist/adapters/webTools.js.map +1 -0
  56. package/dist/agents/draftAnalyzer.d.ts +1 -1
  57. package/dist/agents/draftAnalyzer.d.ts.map +1 -1
  58. package/dist/agents/draftAnalyzer.js +3 -3
  59. package/dist/agents/draftAnalyzer.js.map +1 -1
  60. package/dist/agents/pairPipeline.d.ts +26 -1
  61. package/dist/agents/pairPipeline.d.ts.map +1 -1
  62. package/dist/agents/pairPipeline.js +184 -17
  63. package/dist/agents/pairPipeline.js.map +1 -1
  64. package/dist/agents/reflection.d.ts +56 -0
  65. package/dist/agents/reflection.d.ts.map +1 -0
  66. package/dist/agents/reflection.js +120 -0
  67. package/dist/agents/reflection.js.map +1 -0
  68. package/dist/agents/worker.d.ts +8 -0
  69. package/dist/agents/worker.d.ts.map +1 -1
  70. package/dist/agents/worker.js +23 -2
  71. package/dist/agents/worker.js.map +1 -1
  72. package/dist/auth/index.d.ts +3 -1
  73. package/dist/auth/index.d.ts.map +1 -1
  74. package/dist/auth/index.js +3 -1
  75. package/dist/auth/index.js.map +1 -1
  76. package/dist/auth/linearPkce.d.ts +22 -0
  77. package/dist/auth/linearPkce.d.ts.map +1 -0
  78. package/dist/auth/linearPkce.js +208 -0
  79. package/dist/auth/linearPkce.js.map +1 -0
  80. package/dist/auth/oauthPkce.d.ts +4 -3
  81. package/dist/auth/oauthPkce.d.ts.map +1 -1
  82. package/dist/auth/oauthPkce.js +39 -12
  83. package/dist/auth/oauthPkce.js.map +1 -1
  84. package/dist/auth/oauthStore.d.ts +11 -1
  85. package/dist/auth/oauthStore.d.ts.map +1 -1
  86. package/dist/auth/oauthStore.js +14 -2
  87. package/dist/auth/oauthStore.js.map +1 -1
  88. package/dist/auth/openrouterPkce.d.ts +29 -0
  89. package/dist/auth/openrouterPkce.d.ts.map +1 -0
  90. package/dist/auth/openrouterPkce.js +222 -0
  91. package/dist/auth/openrouterPkce.js.map +1 -0
  92. package/dist/automation/autonomousRunner.d.ts +17 -7
  93. package/dist/automation/autonomousRunner.d.ts.map +1 -1
  94. package/dist/automation/autonomousRunner.js +69 -70
  95. package/dist/automation/autonomousRunner.js.map +1 -1
  96. package/dist/automation/backlogGrooming.d.ts +21 -0
  97. package/dist/automation/backlogGrooming.d.ts.map +1 -0
  98. package/dist/automation/backlogGrooming.js +80 -0
  99. package/dist/automation/backlogGrooming.js.map +1 -0
  100. package/dist/automation/localCI.d.ts +24 -0
  101. package/dist/automation/localCI.d.ts.map +1 -0
  102. package/dist/automation/localCI.js +84 -0
  103. package/dist/automation/localCI.js.map +1 -0
  104. package/dist/automation/runnerExecution.d.ts +33 -7
  105. package/dist/automation/runnerExecution.d.ts.map +1 -1
  106. package/dist/automation/runnerExecution.js +202 -154
  107. package/dist/automation/runnerExecution.js.map +1 -1
  108. package/dist/automation/runnerTypes.d.ts +5 -1
  109. package/dist/automation/runnerTypes.d.ts.map +1 -1
  110. package/dist/automation/taskSource.d.ts +101 -0
  111. package/dist/automation/taskSource.d.ts.map +1 -0
  112. package/dist/automation/taskSource.js +136 -0
  113. package/dist/automation/taskSource.js.map +1 -0
  114. package/dist/automation/workerAuditLog.d.ts +29 -0
  115. package/dist/automation/workerAuditLog.d.ts.map +1 -0
  116. package/dist/automation/workerAuditLog.js +82 -0
  117. package/dist/automation/workerAuditLog.js.map +1 -0
  118. package/dist/cli/authHandler.d.ts +14 -5
  119. package/dist/cli/authHandler.d.ts.map +1 -1
  120. package/dist/cli/authHandler.js +131 -36
  121. package/dist/cli/authHandler.js.map +1 -1
  122. package/dist/cli/daemon.d.ts +5 -0
  123. package/dist/cli/daemon.d.ts.map +1 -1
  124. package/dist/cli/daemon.js +13 -0
  125. package/dist/cli/daemon.js.map +1 -1
  126. package/dist/cli/doctorHandler.d.ts +2 -0
  127. package/dist/cli/doctorHandler.d.ts.map +1 -0
  128. package/dist/cli/doctorHandler.js +114 -0
  129. package/dist/cli/doctorHandler.js.map +1 -0
  130. package/dist/cli/initWizard.d.ts +13 -0
  131. package/dist/cli/initWizard.d.ts.map +1 -0
  132. package/dist/cli/initWizard.js +314 -0
  133. package/dist/cli/initWizard.js.map +1 -0
  134. package/dist/cli.js +112 -38
  135. package/dist/cli.js.map +1 -1
  136. package/dist/core/config.d.ts +89 -15
  137. package/dist/core/config.d.ts.map +1 -1
  138. package/dist/core/config.js +100 -23
  139. package/dist/core/config.js.map +1 -1
  140. package/dist/core/envFile.d.ts +6 -0
  141. package/dist/core/envFile.d.ts.map +1 -1
  142. package/dist/core/envFile.js +39 -1
  143. package/dist/core/envFile.js.map +1 -1
  144. package/dist/core/eventHub.d.ts +22 -0
  145. package/dist/core/eventHub.d.ts.map +1 -1
  146. package/dist/core/eventHub.js.map +1 -1
  147. package/dist/core/providerOverride.d.ts +6 -0
  148. package/dist/core/providerOverride.d.ts.map +1 -0
  149. package/dist/core/providerOverride.js +37 -0
  150. package/dist/core/providerOverride.js.map +1 -0
  151. package/dist/core/service.d.ts.map +1 -1
  152. package/dist/core/service.js +43 -20
  153. package/dist/core/service.js.map +1 -1
  154. package/dist/core/types.d.ts +16 -2
  155. package/dist/core/types.d.ts.map +1 -1
  156. package/dist/discord/discordCore.d.ts.map +1 -1
  157. package/dist/discord/discordCore.js +16 -103
  158. package/dist/discord/discordCore.js.map +1 -1
  159. package/dist/discord/discordHandlers.d.ts.map +1 -1
  160. package/dist/discord/discordHandlers.js +15 -12
  161. package/dist/discord/discordHandlers.js.map +1 -1
  162. package/dist/index.js +12 -1
  163. package/dist/index.js.map +1 -1
  164. package/dist/issues/sqliteStore.d.ts.map +1 -1
  165. package/dist/issues/sqliteStore.js +7 -2
  166. package/dist/issues/sqliteStore.js.map +1 -1
  167. package/dist/knowledge/scanner.d.ts.map +1 -1
  168. package/dist/knowledge/scanner.js +5 -0
  169. package/dist/knowledge/scanner.js.map +1 -1
  170. package/dist/linear/linear.d.ts +45 -2
  171. package/dist/linear/linear.d.ts.map +1 -1
  172. package/dist/linear/linear.js +154 -3
  173. package/dist/linear/linear.js.map +1 -1
  174. package/dist/locale/prompts/en.d.ts.map +1 -1
  175. package/dist/locale/prompts/en.js +40 -20
  176. package/dist/locale/prompts/en.js.map +1 -1
  177. package/dist/locale/prompts/ko.d.ts.map +1 -1
  178. package/dist/locale/prompts/ko.js +39 -20
  179. package/dist/locale/prompts/ko.js.map +1 -1
  180. package/dist/locale/types.d.ts +6 -0
  181. package/dist/locale/types.d.ts.map +1 -1
  182. package/dist/mcp/mcpClient.d.ts +27 -0
  183. package/dist/mcp/mcpClient.d.ts.map +1 -0
  184. package/dist/mcp/mcpClient.js +145 -0
  185. package/dist/mcp/mcpClient.js.map +1 -0
  186. package/dist/memory/memoryCore.d.ts.map +1 -1
  187. package/dist/memory/memoryCore.js +8 -2
  188. package/dist/memory/memoryCore.js.map +1 -1
  189. package/dist/memory/repoKnowledge.d.ts +33 -0
  190. package/dist/memory/repoKnowledge.d.ts.map +1 -0
  191. package/dist/memory/repoKnowledge.js +97 -0
  192. package/dist/memory/repoKnowledge.js.map +1 -0
  193. package/dist/notify/notifier.d.ts +26 -0
  194. package/dist/notify/notifier.d.ts.map +1 -0
  195. package/dist/notify/notifier.js +131 -0
  196. package/dist/notify/notifier.js.map +1 -0
  197. package/dist/orchestration/conflictDetector.d.ts +5 -2
  198. package/dist/orchestration/conflictDetector.d.ts.map +1 -1
  199. package/dist/orchestration/conflictDetector.js +35 -6
  200. package/dist/orchestration/conflictDetector.js.map +1 -1
  201. package/dist/orchestration/decisionEngine.d.ts +20 -0
  202. package/dist/orchestration/decisionEngine.d.ts.map +1 -1
  203. package/dist/orchestration/decisionEngine.js +45 -0
  204. package/dist/orchestration/decisionEngine.js.map +1 -1
  205. package/dist/support/banner.d.ts +7 -0
  206. package/dist/support/banner.d.ts.map +1 -0
  207. package/dist/support/banner.js +32 -0
  208. package/dist/support/banner.js.map +1 -0
  209. package/dist/support/chat.js +36 -27
  210. package/dist/support/chat.js.map +1 -1
  211. package/dist/support/chatBackend.d.ts +6 -0
  212. package/dist/support/chatBackend.d.ts.map +1 -1
  213. package/dist/support/chatBackend.js +105 -83
  214. package/dist/support/chatBackend.js.map +1 -1
  215. package/dist/support/chatTui.d.ts.map +1 -1
  216. package/dist/support/chatTui.js +217 -27
  217. package/dist/support/chatTui.js.map +1 -1
  218. package/dist/support/colors.d.ts +15 -0
  219. package/dist/support/colors.d.ts.map +1 -0
  220. package/dist/support/colors.js +23 -0
  221. package/dist/support/colors.js.map +1 -0
  222. package/dist/support/dashboardHtml.d.ts +1 -1
  223. package/dist/support/dashboardHtml.d.ts.map +1 -1
  224. package/dist/support/dashboardHtml.js +318 -65
  225. package/dist/support/dashboardHtml.js.map +1 -1
  226. package/dist/support/planCommand.d.ts +17 -0
  227. package/dist/support/planCommand.d.ts.map +1 -0
  228. package/dist/support/planCommand.js +114 -0
  229. package/dist/support/planCommand.js.map +1 -0
  230. package/dist/support/planner.d.ts +9 -2
  231. package/dist/support/planner.d.ts.map +1 -1
  232. package/dist/support/planner.js +43 -111
  233. package/dist/support/planner.js.map +1 -1
  234. package/dist/support/projectMapper.d.ts.map +1 -1
  235. package/dist/support/projectMapper.js +29 -1
  236. package/dist/support/projectMapper.js.map +1 -1
  237. package/dist/support/promptHelper.d.ts +24 -0
  238. package/dist/support/promptHelper.d.ts.map +1 -0
  239. package/dist/support/promptHelper.js +94 -0
  240. package/dist/support/promptHelper.js.map +1 -0
  241. package/dist/support/rateLimiter.d.ts.map +1 -1
  242. package/dist/support/rateLimiter.js +6 -0
  243. package/dist/support/rateLimiter.js.map +1 -1
  244. package/dist/support/repoMetadata.d.ts +51 -0
  245. package/dist/support/repoMetadata.d.ts.map +1 -0
  246. package/dist/support/repoMetadata.js +91 -0
  247. package/dist/support/repoMetadata.js.map +1 -0
  248. package/dist/support/web.d.ts.map +1 -1
  249. package/dist/support/web.js +196 -71
  250. package/dist/support/web.js.map +1 -1
  251. package/dist/support/worktreeManager.d.ts +6 -1
  252. package/dist/support/worktreeManager.d.ts.map +1 -1
  253. package/dist/support/worktreeManager.js +23 -1
  254. package/dist/support/worktreeManager.js.map +1 -1
  255. package/dist/taskState/store.d.ts +1 -0
  256. package/dist/taskState/store.d.ts.map +1 -1
  257. package/dist/taskState/store.js +22 -1
  258. package/dist/taskState/store.js.map +1 -1
  259. package/package.json +3 -1
@@ -2,42 +2,107 @@
2
2
  // OpenSwarm - Auth CLI Handler
3
3
  // `openswarm auth login/status/logout`
4
4
  // ============================================
5
- import { AuthProfileStore } from '../auth/index.js';
6
- import { loginAndSaveProfile } from '../auth/oauthPkce.js';
7
- const DEFAULT_CLIENT_ID = process.env.OPENAI_CLIENT_ID ?? '';
5
+ import { createInterface } from 'node:readline';
6
+ import { AuthProfileStore, ensureValidToken } from '../auth/index.js';
7
+ import { loginAndSaveProfile, DEFAULT_OPENAI_CLIENT_ID, } from '../auth/oauthPkce.js';
8
+ import { loginAndSaveOpenRouterProfile, saveOpenRouterApiKey, } from '../auth/openrouterPkce.js';
9
+ import { loginAndSaveLinearProfile } from '../auth/linearPkce.js';
10
+ import { getCodexModelIds } from '../adapters/codexModels.js';
11
+ const PROFILE_KEYS = {
12
+ gpt: 'openai-gpt:default',
13
+ openrouter: 'openrouter:default',
14
+ linear: 'linear:default',
15
+ };
16
+ const VALID_PROVIDERS = ['gpt', 'openrouter', 'linear'];
17
+ function assertProvider(provider) {
18
+ if (!VALID_PROVIDERS.includes(provider)) {
19
+ console.error(`지원하지 않는 provider: "${provider}". 지원: ${VALID_PROVIDERS.join(', ')}`);
20
+ process.exit(1);
21
+ }
22
+ }
8
23
  /**
9
- * GPT OAuth 로그인 흐름 실행
24
+ * 로그인 흐름 (provider별 분기)
10
25
  */
11
26
  export async function handleAuthLogin(provider, opts) {
12
- if (provider !== 'gpt') {
13
- console.error(`지원하지 않는 provider: "${provider}". 현재 "gpt"만 지원합니다.`);
14
- process.exit(1);
27
+ assertProvider(provider);
28
+ try {
29
+ if (provider === 'gpt') {
30
+ const clientId = opts.clientId ?? process.env.OPENAI_CLIENT_ID ?? DEFAULT_OPENAI_CLIENT_ID;
31
+ await loginAndSaveProfile(clientId, opts.port);
32
+ printGptPostLoginHint();
33
+ }
34
+ else if (provider === 'linear') {
35
+ await loginAndSaveLinearProfile(opts.port);
36
+ console.log('✓ Linear 연동 완료. `openswarm init`에서 팀/프로젝트를 선택하세요.'); // cxt-ignore: fake_execution — after real OAuth token exchange
37
+ }
38
+ else {
39
+ await loginOpenRouter(opts);
40
+ printOpenRouterPostLoginHint();
41
+ }
15
42
  }
16
- const clientId = opts.clientId ?? DEFAULT_CLIENT_ID;
17
- if (!clientId) {
18
- console.error('OpenAI Client ID가 필요합니다.');
19
- console.error('환경변수 OPENAI_CLIENT_ID를 설정하거나 --client-id 옵션을 사용하세요.');
20
- console.error('');
21
- console.error(' export OPENAI_CLIENT_ID="your-client-id"');
22
- console.error(' openswarm auth login --provider gpt');
23
- console.error('');
24
- console.error('또는:');
25
- console.error(' openswarm auth login --provider gpt --client-id "your-client-id"');
43
+ catch (err) {
44
+ console.error(`로그인 실패: ${err instanceof Error ? err.message : String(err)}`);
26
45
  process.exit(1);
27
46
  }
47
+ }
48
+ async function loginOpenRouter(opts) {
49
+ // 1) Explicit --api-key wins.
50
+ if (opts.apiKey) {
51
+ saveOpenRouterApiKey(opts.apiKey);
52
+ console.log(`[Auth] OpenRouter API key 저장 완료: ${PROFILE_KEYS.openrouter}`);
53
+ return;
54
+ }
55
+ // 2) OPENROUTER_API_KEY env (headless / CI).
56
+ const envKey = process.env.OPENROUTER_API_KEY?.trim();
57
+ if (envKey) {
58
+ saveOpenRouterApiKey(envKey);
59
+ console.log(`[Auth] OPENROUTER_API_KEY 환경 변수에서 키를 저장했습니다: ${PROFILE_KEYS.openrouter}`);
60
+ return;
61
+ }
62
+ // 3) PKCE browser flow (primary path).
28
63
  try {
29
- await loginAndSaveProfile(clientId, opts.port);
30
- console.log('');
31
- console.log('GPT 어댑터를 사용하려면 config.yaml에서 adapter를 변경하세요:');
32
- console.log(' adapter: gpt');
33
- console.log('');
34
- console.log('또는 CLI에서 직접 실행:');
35
- console.log(' openswarm run "your task" --model gpt-4o');
64
+ await loginAndSaveOpenRouterProfile(opts.port);
65
+ return;
36
66
  }
37
67
  catch (err) {
38
- console.error(`OAuth 로그인 실패: ${err instanceof Error ? err.message : String(err)}`);
39
- process.exit(1);
68
+ const message = err instanceof Error ? err.message : String(err);
69
+ console.error(`[Auth] PKCE 흐름 실패: ${message}`);
70
+ console.error('[Auth] API 키 직접 입력으로 전환합니다.');
40
71
  }
72
+ // 4) Interactive API-key fallback when PKCE could not complete.
73
+ const manualKey = await promptForApiKey();
74
+ saveOpenRouterApiKey(manualKey);
75
+ console.log(`[Auth] OpenRouter API key 저장 완료: ${PROFILE_KEYS.openrouter}`);
76
+ }
77
+ function promptForApiKey() {
78
+ return new Promise((resolve, reject) => {
79
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
80
+ rl.question('OpenRouter API key (sk-or-...): ', (answer) => {
81
+ rl.close();
82
+ const trimmed = answer.trim();
83
+ if (!trimmed) {
84
+ reject(new Error('빈 키가 입력되었습니다.'));
85
+ return;
86
+ }
87
+ resolve(trimmed);
88
+ });
89
+ });
90
+ }
91
+ function printGptPostLoginHint() {
92
+ console.log('');
93
+ console.log('GPT 어댑터를 사용하려면 config.yaml에서 adapter를 변경하세요:');
94
+ console.log(' adapter: gpt');
95
+ console.log('');
96
+ console.log('또는 CLI에서 직접 실행:');
97
+ console.log(' openswarm run "your task" --model gpt-4o');
98
+ }
99
+ function printOpenRouterPostLoginHint() {
100
+ console.log('');
101
+ console.log('OpenRouter 어댑터를 사용하려면 config.yaml에서 adapter를 변경하세요:');
102
+ console.log(' adapter: openrouter');
103
+ console.log('');
104
+ console.log('또는 CLI에서 직접 실행 (모델은 provider/model 형식):');
105
+ console.log(' openswarm run "your task" --model anthropic/claude-sonnet-4');
41
106
  }
42
107
  /**
43
108
  * 저장된 인증 프로필 상태 표시
@@ -48,35 +113,65 @@ export function handleAuthStatus() {
48
113
  const keys = Object.keys(profiles);
49
114
  if (keys.length === 0) {
50
115
  console.log('저장된 인증 프로필이 없습니다.');
51
- console.log('로그인: openswarm auth login --provider gpt');
116
+ console.log('로그인:');
117
+ console.log(' openswarm auth login --provider gpt');
118
+ console.log(' openswarm auth login --provider openrouter');
52
119
  return;
53
120
  }
54
121
  console.log('인증 프로필:');
55
122
  console.log('');
56
123
  for (const key of keys) {
57
124
  const p = profiles[key];
58
- const expired = Date.now() > p.expires;
59
- const expiresAt = new Date(p.expires).toLocaleString('ko-KR', { timeZone: 'Asia/Seoul' });
60
- const status = expired ? '만료됨' : '유효';
125
+ const isApiKey = p.type === 'apiKey';
126
+ const expired = !isApiKey && Date.now() > p.expires;
127
+ const expiresAt = isApiKey
128
+ ? '∞ (API key)'
129
+ : `${new Date(p.expires).toLocaleString('ko-KR', { timeZone: 'Asia/Seoul' })} (${expired ? '만료됨' : '유효'})`;
61
130
  console.log(` ${key}`);
62
131
  console.log(` Provider: ${p.provider}`);
132
+ console.log(` Type: ${p.type}`);
63
133
  console.log(` Token: ${maskToken(p.access)}`);
64
- console.log(` Expires: ${expiresAt} (${status})`);
134
+ console.log(` Expires: ${expiresAt}`);
65
135
  if (p.accountId) {
66
136
  console.log(` Account: ${p.accountId}`);
67
137
  }
68
138
  console.log('');
69
139
  }
70
140
  }
141
+ /**
142
+ * 사용 가능한 Codex 모델 목록 표시.
143
+ * GPT/Codex OAuth 토큰이 있으면 라이브로(chatgpt.com Codex 백엔드) 조회하고,
144
+ * 없으면 ~/.codex 로컬 소스 + 큐레이트 fallback으로 표시한다.
145
+ */
146
+ export async function handleAuthModels() {
147
+ const store = new AuthProfileStore();
148
+ let accessToken;
149
+ if (store.getProfile(PROFILE_KEYS.gpt)) {
150
+ try {
151
+ accessToken = await ensureValidToken(store, PROFILE_KEYS.gpt);
152
+ }
153
+ catch (err) {
154
+ console.warn(`[Auth] 토큰 검증 실패 (${err instanceof Error ? err.message : String(err)}). 오프라인 fallback으로 표시합니다.`);
155
+ }
156
+ }
157
+ else {
158
+ console.log('GPT/Codex 인증 프로필이 없습니다 — 오프라인 fallback 목록을 표시합니다.');
159
+ console.log('라이브 조회: openswarm auth login --provider gpt');
160
+ console.log('');
161
+ }
162
+ const models = await getCodexModelIds(accessToken);
163
+ const source = accessToken ? 'live · Codex OAuth backend' : 'offline fallback';
164
+ console.log(`Codex 모델 (${source}):`);
165
+ for (const model of models) {
166
+ console.log(` ${model}`);
167
+ }
168
+ }
71
169
  /**
72
170
  * 인증 프로필 삭제
73
171
  */
74
172
  export function handleAuthLogout(provider) {
75
- if (provider !== 'gpt') {
76
- console.error(`지원하지 않는 provider: "${provider}". 현재 "gpt"만 지원합니다.`);
77
- process.exit(1);
78
- }
79
- const profileKey = 'openai-gpt:default';
173
+ assertProvider(provider);
174
+ const profileKey = PROFILE_KEYS[provider];
80
175
  const store = new AuthProfileStore();
81
176
  if (store.deleteProfile(profileKey)) {
82
177
  console.log(`프로필 "${profileKey}" 삭제 완료.`);
@@ -1 +1 @@
1
- {"version":3,"file":"authHandler.js","sourceRoot":"","sources":["../../src/cli/authHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authHandler.js","sourceRoot":"","sources":["../../src/cli/authHandler.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,11 @@ export declare function startDaemon(): {
20
20
  * or throws if it's still alive after the timeout.
21
21
  */
22
22
  export declare function stopDaemon(timeoutMs?: number): Promise<boolean>;
23
+ /**
24
+ * Read the last `lines` lines of the daemon log. Used by `openswarm start` to
25
+ * show why the daemon exited when it dies during startup.
26
+ */
27
+ export declare function readLogTail(lines?: number): string;
23
28
  export declare function getDaemonStatus(): DaemonStatus;
24
29
  export declare const DAEMON_PATHS: {
25
30
  readonly STATE_DIR: string;
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAiCD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA2C9D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BrE;AAED,wBAAgB,eAAe,IAAI,YAAY,CAa9C;AAED,eAAO,MAAM,YAAY;;;;;CAAsD,CAAC"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAiCD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA2C9D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BrE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,SAAK,GAAG,MAAM,CAO9C;AAED,wBAAgB,eAAe,IAAI,YAAY,CAa9C;AAED,eAAO,MAAM,YAAY;;;;;CAAsD,CAAC"}
@@ -124,6 +124,19 @@ export async function stopDaemon(timeoutMs = 10_000) {
124
124
  throw new Error(`Daemon (pid ${pid}) did not exit within ${timeoutMs}ms. ` +
125
125
  `It may still be shutting down; retry 'openswarm status' shortly or send SIGKILL manually.`);
126
126
  }
127
+ /**
128
+ * Read the last `lines` lines of the daemon log. Used by `openswarm start` to
129
+ * show why the daemon exited when it dies during startup.
130
+ */
131
+ export function readLogTail(lines = 20) {
132
+ try {
133
+ const content = readFileSync(LOG_FILE, 'utf8');
134
+ return content.split('\n').slice(-lines).join('\n').trimEnd();
135
+ }
136
+ catch {
137
+ return '(log file unavailable)';
138
+ }
139
+ }
127
140
  export function getDaemonStatus() {
128
141
  const pid = readPidFile();
129
142
  if (pid === null || !isProcessAlive(pid)) {
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function handleDoctor(): Promise<void>;
2
+ //# sourceMappingURL=doctorHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctorHandler.d.ts","sourceRoot":"","sources":["../../src/cli/doctorHandler.ts"],"names":[],"mappings":"AA0CA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA4ElD"}
@@ -0,0 +1,114 @@
1
+ // ============================================
2
+ // OpenSwarm - `openswarm doctor`
3
+ // Fresh-install self-diagnosis: runtime, native modules, external CLIs,
4
+ // providers, ports, config, Linear. Exits non-zero on critical issues.
5
+ // ============================================
6
+ import { execFile } from 'node:child_process';
7
+ import { promisify } from 'node:util';
8
+ import { createServer } from 'node:net';
9
+ import { listAvailableAdapters } from '../adapters/index.js';
10
+ import { findConfigFile } from '../core/config.js';
11
+ import { banner } from '../support/banner.js';
12
+ import { c } from '../support/colors.js';
13
+ const execFileAsync = promisify(execFile);
14
+ function line(status, label, detail = '') {
15
+ const icon = status === 'ok' ? c.green('✓') : status === 'warn' ? c.yellow('⚠') : c.red('✗');
16
+ console.log(`${icon} ${c.bold(label)}${detail ? ` ${c.dim('—')} ${c.dim(detail)}` : ''}`);
17
+ }
18
+ async function which(bin) {
19
+ try {
20
+ const { stdout } = await execFileAsync('which', [bin]);
21
+ return stdout.trim() || null;
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /** True if the TCP port is free to bind on localhost. */
28
+ async function portFree(port) {
29
+ return new Promise((resolve) => {
30
+ const srv = createServer();
31
+ srv.once('error', () => resolve(false));
32
+ srv.once('listening', () => srv.close(() => resolve(true)));
33
+ srv.listen(port, '127.0.0.1');
34
+ });
35
+ }
36
+ export async function handleDoctor() {
37
+ console.log(banner('doctor — environment check'));
38
+ let fatal = false;
39
+ // 1) Node.js runtime
40
+ const nodeMajor = parseInt(process.versions.node.split('.')[0], 10);
41
+ if (nodeMajor >= 22) {
42
+ line('ok', 'Node.js', process.version);
43
+ }
44
+ else {
45
+ line('fail', 'Node.js', `${process.version} — need >= 22`);
46
+ fatal = true;
47
+ }
48
+ // 2) Native modules (prebuilt binaries on common platforms; else build toolchain)
49
+ for (const mod of ['better-sqlite3', '@lancedb/lancedb']) {
50
+ try {
51
+ await import(mod);
52
+ line('ok', `native: ${mod}`, 'loads');
53
+ }
54
+ catch {
55
+ line('fail', `native: ${mod}`, 'load failed — install python3 + a C/C++ toolchain, then reinstall');
56
+ fatal = true;
57
+ }
58
+ }
59
+ // 3) External CLIs on PATH
60
+ const clis = [
61
+ ['codex', 'warn', 'codex provider'],
62
+ ['claude', 'warn', 'claude (opt-in) provider'],
63
+ ['git', 'warn', 'required for worktree mode / PRs'],
64
+ ['gh', 'warn', 'optional — CI monitoring'],
65
+ ];
66
+ for (const [bin, missStatus, note] of clis) {
67
+ const path = await which(bin);
68
+ if (path)
69
+ line('ok', `cli: ${bin}`, path);
70
+ else
71
+ line(missStatus, `cli: ${bin}`, `not on PATH (${note})`);
72
+ }
73
+ // 4) LLM providers (env keys + OAuth profiles + PATH binaries + local servers)
74
+ const available = await listAvailableAdapters();
75
+ if (available.length > 0) {
76
+ line('ok', 'providers', available.join(', '));
77
+ }
78
+ else {
79
+ line('fail', 'providers', 'none usable — run `openswarm auth login` (codex/gpt/openrouter) or start a local model');
80
+ fatal = true;
81
+ }
82
+ // 5) Ports (web dashboard + OAuth callbacks)
83
+ const ports = [
84
+ [3847, 'web dashboard'],
85
+ [1455, 'codex OAuth callback'],
86
+ [1456, 'openrouter OAuth callback'],
87
+ [1457, 'linear OAuth callback'],
88
+ ];
89
+ for (const [port, use] of ports) {
90
+ const free = await portFree(port);
91
+ line(free ? 'ok' : 'warn', `port ${port}`, free ? `free (${use})` : `in use (${use}) — close the holder before that flow`);
92
+ }
93
+ // 6) Config file resolution (cwd ./config.yaml vs ~/.config/openswarm)
94
+ const cfg = findConfigFile();
95
+ if (cfg)
96
+ line('ok', 'config', cfg);
97
+ else
98
+ line('warn', 'config', 'none found — run `openswarm init` (or set OPENSWARM_CONFIG)');
99
+ // 7) Linear task source (optional)
100
+ const { AuthProfileStore } = await import('../auth/index.js');
101
+ const hasOAuth = !!new AuthProfileStore().getProfile('linear:default');
102
+ const hasKey = !!process.env.LINEAR_API_KEY;
103
+ if (hasOAuth || hasKey)
104
+ line('ok', 'linear', hasOAuth ? 'OAuth profile' : 'API key');
105
+ else
106
+ line('warn', 'linear', 'not configured — local SQLite issue store will be used');
107
+ console.log('');
108
+ if (fatal) {
109
+ console.log(c.red(c.bold('✗ Critical issues found — fix the ✗ items above.')));
110
+ process.exit(1);
111
+ }
112
+ console.log(c.green(c.bold('✓ No critical issues.')));
113
+ }
114
+ //# sourceMappingURL=doctorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctorHandler.js","sourceRoot":"","sources":["../../src/cli/doctorHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ type ProviderId = 'codex-responses' | 'openrouter' | 'gpt' | 'lmstudio' | 'local' | 'codex' | 'claude';
2
+ type NotifyChannel = 'none' | 'discord' | 'slack' | 'telegram' | 'webhook';
3
+ /** Apply the wizard's choices onto the static sample config via targeted replaces. */
4
+ export declare function buildWizardConfig(adapter: ProviderId, channel: NotifyChannel, agent?: {
5
+ name: string;
6
+ projectPath: string;
7
+ }): string;
8
+ export interface InitWizardOptions {
9
+ force?: boolean;
10
+ }
11
+ export declare function runInitWizard(opts?: InitWizardOptions): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=initWizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initWizard.d.ts","sourceRoot":"","sources":["../../src/cli/initWizard.ts"],"names":[],"mappings":"AAsBA,KAAK,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,KAAK,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvG,KAAK,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AA2B3E,sFAAsF;AACtF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,CAsBR;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA+JD,wBAAsB,aAAa,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiG/E"}