@intrect/openswarm 0.5.0 → 0.8.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 (226) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +97 -35
  3. package/config.example.yaml +8 -2
  4. package/dist/adapters/agenticLoop.d.ts +15 -1
  5. package/dist/adapters/agenticLoop.d.ts.map +1 -1
  6. package/dist/adapters/agenticLoop.js +62 -4
  7. package/dist/adapters/agenticLoop.js.map +1 -1
  8. package/dist/adapters/chatStream.d.ts +55 -0
  9. package/dist/adapters/chatStream.d.ts.map +1 -0
  10. package/dist/adapters/chatStream.js +116 -0
  11. package/dist/adapters/chatStream.js.map +1 -0
  12. package/dist/adapters/codex.d.ts +6 -0
  13. package/dist/adapters/codex.d.ts.map +1 -1
  14. package/dist/adapters/codex.js +27 -1
  15. package/dist/adapters/codex.js.map +1 -1
  16. package/dist/adapters/codexModels.d.ts +20 -0
  17. package/dist/adapters/codexModels.d.ts.map +1 -0
  18. package/dist/adapters/codexModels.js +195 -0
  19. package/dist/adapters/codexModels.js.map +1 -0
  20. package/dist/adapters/codexResponses.d.ts +97 -0
  21. package/dist/adapters/codexResponses.d.ts.map +1 -0
  22. package/dist/adapters/codexResponses.js +302 -0
  23. package/dist/adapters/codexResponses.js.map +1 -0
  24. package/dist/adapters/gpt.d.ts.map +1 -1
  25. package/dist/adapters/gpt.js +17 -131
  26. package/dist/adapters/gpt.js.map +1 -1
  27. package/dist/adapters/index.d.ts +7 -0
  28. package/dist/adapters/index.d.ts.map +1 -1
  29. package/dist/adapters/index.js +11 -0
  30. package/dist/adapters/index.js.map +1 -1
  31. package/dist/adapters/local.d.ts.map +1 -1
  32. package/dist/adapters/local.js +17 -125
  33. package/dist/adapters/local.js.map +1 -1
  34. package/dist/adapters/openrouter.d.ts +5 -24
  35. package/dist/adapters/openrouter.d.ts.map +1 -1
  36. package/dist/adapters/openrouter.js +20 -121
  37. package/dist/adapters/openrouter.js.map +1 -1
  38. package/dist/adapters/resultParsing.d.ts +6 -0
  39. package/dist/adapters/resultParsing.d.ts.map +1 -0
  40. package/dist/adapters/resultParsing.js +139 -0
  41. package/dist/adapters/resultParsing.js.map +1 -0
  42. package/dist/adapters/tools.d.ts +0 -6
  43. package/dist/adapters/tools.d.ts.map +1 -1
  44. package/dist/adapters/tools.js +57 -3
  45. package/dist/adapters/tools.js.map +1 -1
  46. package/dist/adapters/types.d.ts +21 -1
  47. package/dist/adapters/types.d.ts.map +1 -1
  48. package/dist/adapters/webTools.d.ts +9 -0
  49. package/dist/adapters/webTools.d.ts.map +1 -0
  50. package/dist/adapters/webTools.js +195 -0
  51. package/dist/adapters/webTools.js.map +1 -0
  52. package/dist/agents/pairPipeline.d.ts +26 -1
  53. package/dist/agents/pairPipeline.d.ts.map +1 -1
  54. package/dist/agents/pairPipeline.js +82 -14
  55. package/dist/agents/pairPipeline.js.map +1 -1
  56. package/dist/agents/reflection.d.ts +56 -0
  57. package/dist/agents/reflection.d.ts.map +1 -0
  58. package/dist/agents/reflection.js +120 -0
  59. package/dist/agents/reflection.js.map +1 -0
  60. package/dist/agents/worker.d.ts +2 -0
  61. package/dist/agents/worker.d.ts.map +1 -1
  62. package/dist/agents/worker.js +1 -0
  63. package/dist/agents/worker.js.map +1 -1
  64. package/dist/auth/index.d.ts +1 -0
  65. package/dist/auth/index.d.ts.map +1 -1
  66. package/dist/auth/index.js +1 -0
  67. package/dist/auth/index.js.map +1 -1
  68. package/dist/auth/linearPkce.d.ts +22 -0
  69. package/dist/auth/linearPkce.d.ts.map +1 -0
  70. package/dist/auth/linearPkce.js +208 -0
  71. package/dist/auth/linearPkce.js.map +1 -0
  72. package/dist/auth/oauthPkce.d.ts.map +1 -1
  73. package/dist/auth/oauthPkce.js +18 -5
  74. package/dist/auth/oauthPkce.js.map +1 -1
  75. package/dist/auth/oauthStore.d.ts.map +1 -1
  76. package/dist/auth/oauthStore.js +10 -2
  77. package/dist/auth/oauthStore.js.map +1 -1
  78. package/dist/automation/autonomousRunner.d.ts +6 -6
  79. package/dist/automation/autonomousRunner.d.ts.map +1 -1
  80. package/dist/automation/autonomousRunner.js +15 -13
  81. package/dist/automation/autonomousRunner.js.map +1 -1
  82. package/dist/automation/backlogGrooming.d.ts +21 -0
  83. package/dist/automation/backlogGrooming.d.ts.map +1 -0
  84. package/dist/automation/backlogGrooming.js +80 -0
  85. package/dist/automation/backlogGrooming.js.map +1 -0
  86. package/dist/automation/localCI.d.ts +24 -0
  87. package/dist/automation/localCI.d.ts.map +1 -0
  88. package/dist/automation/localCI.js +84 -0
  89. package/dist/automation/localCI.js.map +1 -0
  90. package/dist/automation/runnerExecution.d.ts +33 -7
  91. package/dist/automation/runnerExecution.d.ts.map +1 -1
  92. package/dist/automation/runnerExecution.js +202 -154
  93. package/dist/automation/runnerExecution.js.map +1 -1
  94. package/dist/automation/runnerTypes.d.ts +5 -1
  95. package/dist/automation/runnerTypes.d.ts.map +1 -1
  96. package/dist/automation/taskSource.d.ts +101 -0
  97. package/dist/automation/taskSource.d.ts.map +1 -0
  98. package/dist/automation/taskSource.js +136 -0
  99. package/dist/automation/taskSource.js.map +1 -0
  100. package/dist/automation/workerAuditLog.d.ts +29 -0
  101. package/dist/automation/workerAuditLog.d.ts.map +1 -0
  102. package/dist/automation/workerAuditLog.js +82 -0
  103. package/dist/automation/workerAuditLog.js.map +1 -0
  104. package/dist/cli/authHandler.d.ts +6 -0
  105. package/dist/cli/authHandler.d.ts.map +1 -1
  106. package/dist/cli/authHandler.js +37 -2
  107. package/dist/cli/authHandler.js.map +1 -1
  108. package/dist/cli/daemon.d.ts +5 -0
  109. package/dist/cli/daemon.d.ts.map +1 -1
  110. package/dist/cli/daemon.js +13 -0
  111. package/dist/cli/daemon.js.map +1 -1
  112. package/dist/cli/doctorHandler.d.ts +2 -0
  113. package/dist/cli/doctorHandler.d.ts.map +1 -0
  114. package/dist/cli/doctorHandler.js +114 -0
  115. package/dist/cli/doctorHandler.js.map +1 -0
  116. package/dist/cli/initWizard.d.ts +13 -0
  117. package/dist/cli/initWizard.d.ts.map +1 -0
  118. package/dist/cli/initWizard.js +334 -0
  119. package/dist/cli/initWizard.js.map +1 -0
  120. package/dist/cli.js +110 -37
  121. package/dist/cli.js.map +1 -1
  122. package/dist/core/config.d.ts +50 -2
  123. package/dist/core/config.d.ts.map +1 -1
  124. package/dist/core/config.js +69 -10
  125. package/dist/core/config.js.map +1 -1
  126. package/dist/core/envFile.d.ts +6 -0
  127. package/dist/core/envFile.d.ts.map +1 -1
  128. package/dist/core/envFile.js +39 -1
  129. package/dist/core/envFile.js.map +1 -1
  130. package/dist/core/providerOverride.d.ts +6 -0
  131. package/dist/core/providerOverride.d.ts.map +1 -0
  132. package/dist/core/providerOverride.js +37 -0
  133. package/dist/core/providerOverride.js.map +1 -0
  134. package/dist/core/service.d.ts.map +1 -1
  135. package/dist/core/service.js +41 -18
  136. package/dist/core/service.js.map +1 -1
  137. package/dist/core/types.d.ts +16 -2
  138. package/dist/core/types.d.ts.map +1 -1
  139. package/dist/discord/discordHandlers.d.ts.map +1 -1
  140. package/dist/discord/discordHandlers.js +15 -12
  141. package/dist/discord/discordHandlers.js.map +1 -1
  142. package/dist/index.js +12 -1
  143. package/dist/index.js.map +1 -1
  144. package/dist/issues/sqliteStore.d.ts.map +1 -1
  145. package/dist/issues/sqliteStore.js +7 -2
  146. package/dist/issues/sqliteStore.js.map +1 -1
  147. package/dist/knowledge/scanner.d.ts.map +1 -1
  148. package/dist/knowledge/scanner.js +5 -0
  149. package/dist/knowledge/scanner.js.map +1 -1
  150. package/dist/linear/linear.d.ts +45 -2
  151. package/dist/linear/linear.d.ts.map +1 -1
  152. package/dist/linear/linear.js +154 -3
  153. package/dist/linear/linear.js.map +1 -1
  154. package/dist/locale/prompts/en.d.ts.map +1 -1
  155. package/dist/locale/prompts/en.js +14 -2
  156. package/dist/locale/prompts/en.js.map +1 -1
  157. package/dist/locale/prompts/ko.d.ts.map +1 -1
  158. package/dist/locale/prompts/ko.js +14 -2
  159. package/dist/locale/prompts/ko.js.map +1 -1
  160. package/dist/mcp/mcpClient.d.ts +27 -0
  161. package/dist/mcp/mcpClient.d.ts.map +1 -0
  162. package/dist/mcp/mcpClient.js +145 -0
  163. package/dist/mcp/mcpClient.js.map +1 -0
  164. package/dist/memory/memoryCore.d.ts.map +1 -1
  165. package/dist/memory/memoryCore.js +8 -2
  166. package/dist/memory/memoryCore.js.map +1 -1
  167. package/dist/notify/notifier.d.ts +26 -0
  168. package/dist/notify/notifier.d.ts.map +1 -0
  169. package/dist/notify/notifier.js +131 -0
  170. package/dist/notify/notifier.js.map +1 -0
  171. package/dist/orchestration/conflictDetector.d.ts +5 -2
  172. package/dist/orchestration/conflictDetector.d.ts.map +1 -1
  173. package/dist/orchestration/conflictDetector.js +35 -6
  174. package/dist/orchestration/conflictDetector.js.map +1 -1
  175. package/dist/orchestration/decisionEngine.d.ts +20 -0
  176. package/dist/orchestration/decisionEngine.d.ts.map +1 -1
  177. package/dist/orchestration/decisionEngine.js +45 -0
  178. package/dist/orchestration/decisionEngine.js.map +1 -1
  179. package/dist/support/banner.d.ts +7 -0
  180. package/dist/support/banner.d.ts.map +1 -0
  181. package/dist/support/banner.js +32 -0
  182. package/dist/support/banner.js.map +1 -0
  183. package/dist/support/chat.js +28 -5
  184. package/dist/support/chat.js.map +1 -1
  185. package/dist/support/chatBackend.d.ts +6 -0
  186. package/dist/support/chatBackend.d.ts.map +1 -1
  187. package/dist/support/chatBackend.js +68 -0
  188. package/dist/support/chatBackend.js.map +1 -1
  189. package/dist/support/chatTui.d.ts.map +1 -1
  190. package/dist/support/chatTui.js +202 -9
  191. package/dist/support/chatTui.js.map +1 -1
  192. package/dist/support/colors.d.ts +15 -0
  193. package/dist/support/colors.d.ts.map +1 -0
  194. package/dist/support/colors.js +23 -0
  195. package/dist/support/colors.js.map +1 -0
  196. package/dist/support/planCommand.d.ts +17 -0
  197. package/dist/support/planCommand.d.ts.map +1 -0
  198. package/dist/support/planCommand.js +114 -0
  199. package/dist/support/planCommand.js.map +1 -0
  200. package/dist/support/planner.d.ts +9 -2
  201. package/dist/support/planner.d.ts.map +1 -1
  202. package/dist/support/planner.js +43 -111
  203. package/dist/support/planner.js.map +1 -1
  204. package/dist/support/promptHelper.d.ts +24 -0
  205. package/dist/support/promptHelper.d.ts.map +1 -0
  206. package/dist/support/promptHelper.js +94 -0
  207. package/dist/support/promptHelper.js.map +1 -0
  208. package/dist/support/rateLimiter.d.ts.map +1 -1
  209. package/dist/support/rateLimiter.js +6 -0
  210. package/dist/support/rateLimiter.js.map +1 -1
  211. package/dist/support/repoMetadata.d.ts +7 -0
  212. package/dist/support/repoMetadata.d.ts.map +1 -1
  213. package/dist/support/repoMetadata.js +13 -1
  214. package/dist/support/repoMetadata.js.map +1 -1
  215. package/dist/support/web.d.ts.map +1 -1
  216. package/dist/support/web.js +143 -65
  217. package/dist/support/web.js.map +1 -1
  218. package/dist/support/worktreeManager.d.ts +6 -1
  219. package/dist/support/worktreeManager.d.ts.map +1 -1
  220. package/dist/support/worktreeManager.js +23 -1
  221. package/dist/support/worktreeManager.js.map +1 -1
  222. package/dist/taskState/store.d.ts +1 -0
  223. package/dist/taskState/store.d.ts.map +1 -1
  224. package/dist/taskState/store.js +22 -1
  225. package/dist/taskState/store.js.map +1 -1
  226. package/package.json +4 -2
@@ -3,14 +3,17 @@
3
3
  // `openswarm auth login/status/logout`
4
4
  // ============================================
5
5
  import { createInterface } from 'node:readline';
6
- import { AuthProfileStore } from '../auth/index.js';
6
+ import { AuthProfileStore, ensureValidToken } from '../auth/index.js';
7
7
  import { loginAndSaveProfile, DEFAULT_OPENAI_CLIENT_ID, } from '../auth/oauthPkce.js';
8
8
  import { loginAndSaveOpenRouterProfile, saveOpenRouterApiKey, } from '../auth/openrouterPkce.js';
9
+ import { loginAndSaveLinearProfile } from '../auth/linearPkce.js';
10
+ import { getCodexModelIds } from '../adapters/codexModels.js';
9
11
  const PROFILE_KEYS = {
10
12
  gpt: 'openai-gpt:default',
11
13
  openrouter: 'openrouter:default',
14
+ linear: 'linear:default',
12
15
  };
13
- const VALID_PROVIDERS = ['gpt', 'openrouter'];
16
+ const VALID_PROVIDERS = ['gpt', 'openrouter', 'linear'];
14
17
  function assertProvider(provider) {
15
18
  if (!VALID_PROVIDERS.includes(provider)) {
16
19
  console.error(`지원하지 않는 provider: "${provider}". 지원: ${VALID_PROVIDERS.join(', ')}`);
@@ -28,6 +31,10 @@ export async function handleAuthLogin(provider, opts) {
28
31
  await loginAndSaveProfile(clientId, opts.port);
29
32
  printGptPostLoginHint();
30
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
+ }
31
38
  else {
32
39
  await loginOpenRouter(opts);
33
40
  printOpenRouterPostLoginHint();
@@ -131,6 +138,34 @@ export function handleAuthStatus() {
131
138
  console.log('');
132
139
  }
133
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
+ }
134
169
  /**
135
170
  * 인증 프로필 삭제
136
171
  */
@@ -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":"AAAA,+CAA+C;AAC/C,+BAA+B;AAC/B,uCAAuC;AACvC,+CAA+C;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAI9D,MAAM,YAAY,GAA6B;IAC7C,GAAG,EAAE,oBAAoB;IACzB,UAAU,EAAE,oBAAoB;IAChC,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,MAAM,eAAe,GAAe,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEpE,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAoB,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CACX,sBAAsB,QAAQ,UAAU,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AASD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,IAAmB;IAEnB,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEzB,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,wBAAwB,CAAC;YAC5E,MAAM,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,qBAAqB,EAAE,CAAC;QAC1B,CAAC;aAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC,+DAA+D;QACnI,CAAC;aAAM,CAAC;YACN,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5B,4BAA4B,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAmB;IAChD,8BAA8B;IAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,oCAAoC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,6CAA6C;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,MAAM,EAAE,CAAC;QACX,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CACT,gDAAgD,YAAY,CAAC,UAAU,EAAE,CAC1E,CAAC;QACF,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC;QACH,MAAM,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC/C,CAAC;IAED,gEAAgE;IAChE,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IAC1C,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,oCAAoC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,EAAE,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,MAAM,EAAE,EAAE;YACzD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;QACrC,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC;QACpD,MAAM,SAAS,GAAG,QAAQ;YACxB,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAE7G,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACrC,IAAI,WAA+B,CAAC;IAEpC,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAChG,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAE/E,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,IAAI,CAAC,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEzB,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAErC,IAAI,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,UAAU,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,kBAAkB,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -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":"AAAA,+CAA+C;AAC/C,kDAAkD;AAClD,+CAA+C;AAC/C,EAAE;AACF,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAC/E,oEAAoE;AAEpE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7G,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAUhD,SAAS,eAAe;IACtB,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,eAAe,EAAE,CAAC;IAElB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,QAAQ,KAAK,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,qCAAqC,QAAQ,KAAK;YAClD,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,6DAA6D;QAC7D,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,4EAA4E;IAC5E,4BAA4B;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE;QACjD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;QAC/B,yEAAyE;QACzE,+CAA+C;QAC/C,GAAG,EAAE,OAAO,EAAE;QACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5D,sCAAsC;IACtC,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAS,GAAG,MAAM;IACjD,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAE/B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,kBAAkB;QAClB,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,KAAK,CACb,eAAe,GAAG,yBAAyB,SAAS,MAAM;QAC1D,2FAA2F,CAC5F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,aAAiC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAW,CAAC"}
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":"AAuBA,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,CAkH/E"}
@@ -0,0 +1,334 @@
1
+ // ============================================
2
+ // OpenSwarm - First-run onboarding wizard
3
+ // `openswarm init` (interactive). INT-1578 / INT-1808.
4
+ // ============================================
5
+ //
6
+ // Walks a fresh user through: AI provider (availability detection + inline
7
+ // auth), task backend (Linear with an arrow-key team/project picker, or local
8
+ // SQLite), and an optional notification channel. Writes a .env (secrets, 0600)
9
+ // + config.yaml + an openswarm.json repo→Linear mapping, then prints next steps.
10
+ // `--yes` keeps the config-only path for CI (handled by the caller in cli.ts).
11
+ import { existsSync, writeFileSync, lstatSync, realpathSync } from 'node:fs';
12
+ import { basename, join } from 'node:path';
13
+ import { homedir } from 'node:os';
14
+ import { select, input, password, confirm } from '@inquirer/prompts';
15
+ import { writeEnvVars } from '../core/envFile.js';
16
+ import { generateSampleConfig } from '../core/config.js';
17
+ import { AuthProfileStore, loginAndSaveLinearProfile, ensureValidToken } from '../auth/index.js';
18
+ import { getAdapter } from '../adapters/index.js';
19
+ import { listTeams, listProjects } from '../linear/index.js';
20
+ import { saveRepoMetadata } from '../support/repoMetadata.js';
21
+ import { banner } from '../support/banner.js';
22
+ const PROVIDER_CHOICES = [
23
+ { name: 'codex-responses', value: 'codex-responses', description: 'ChatGPT subscription (OAuth) — Codex models, native loop' },
24
+ { name: 'codex', value: 'codex', description: 'External codex CLI (delegated)' },
25
+ { name: 'openrouter', value: 'openrouter', description: 'OpenRouter API key or OAuth (any model)' },
26
+ { name: 'gpt', value: 'gpt', description: 'OpenAI ChatGPT OAuth (chat/completions)' },
27
+ { name: 'claude', value: 'claude', description: 'Claude Code CLI (claude -p) — opt-in fallback' },
28
+ { name: 'lmstudio', value: 'lmstudio', description: 'Local LM Studio server (no account)' },
29
+ { name: 'local', value: 'local', description: 'Local Ollama models (no account)' },
30
+ ];
31
+ const NOTIFY_CHOICES = [
32
+ { name: 'none', value: 'none', description: 'No outbound notifications' },
33
+ { name: 'discord', value: 'discord', description: 'Discord bot token + channel id' },
34
+ { name: 'slack', value: 'slack', description: 'Slack incoming webhook URL' },
35
+ { name: 'telegram', value: 'telegram', description: 'Telegram bot token + chat id' },
36
+ { name: 'webhook', value: 'webhook', description: 'Generic webhook URL' },
37
+ ];
38
+ /** ChatGPT-OAuth providers share the openai-gpt profile; openrouter has its own. */
39
+ function authPlanFor(provider) {
40
+ if (provider === 'codex-responses' || provider === 'gpt')
41
+ return { providerArg: 'gpt', profileKey: 'openai-gpt:default' };
42
+ if (provider === 'openrouter')
43
+ return { providerArg: 'openrouter', profileKey: 'openrouter:default' };
44
+ return null; // lmstudio / local / codex / claude need no OAuth here
45
+ }
46
+ /** Apply the wizard's choices onto the static sample config via targeted replaces. */
47
+ export function buildWizardConfig(adapter, channel, agent) {
48
+ let cfg = generateSampleConfig();
49
+ cfg = cfg.replace(/^adapter: codex$/m, `adapter: ${adapter}`);
50
+ cfg = cfg.replace(/^ {2}channel: discord$/m, ` channel: ${channel === 'none' ? 'none' : channel}`);
51
+ // Replace the sample's placeholder agents (main/backend) with a single agent
52
+ // for THIS repo so the user doesn't have to hand-edit projectPath.
53
+ if (agent) {
54
+ cfg = cfg.replace(/agents:\n[\s\S]*?\n\n(# Default heartbeat)/, `agents:\n - name: ${agent.name}\n projectPath: ${agent.projectPath}\n heartbeatInterval: 1800000\n enabled: true\n paused: false\n\n$1`);
55
+ }
56
+ const uncomment = (field) => {
57
+ cfg = cfg.replace(` # ${field}:`, ` ${field}:`);
58
+ };
59
+ if (channel === 'slack')
60
+ uncomment('slackWebhookUrl');
61
+ if (channel === 'telegram') {
62
+ uncomment('telegramBotToken');
63
+ uncomment('telegramChatId');
64
+ }
65
+ if (channel === 'webhook')
66
+ uncomment('webhookUrl');
67
+ return cfg;
68
+ }
69
+ /**
70
+ * Provider bootstrap. `adapter.isAvailable()` is the canonical "already
71
+ * configured?" probe — it covers env keys, OAuth profiles, PATH binaries, and
72
+ * local servers (the old wizard only checked OAuth profiles). When not available,
73
+ * branch on how to set the provider up. Returns whether to run inline OAuth after
74
+ * the wizard, plus the auth plan.
75
+ */
76
+ async function bootstrapProvider(provider) {
77
+ let available = false;
78
+ try {
79
+ available = await getAdapter(provider).isAvailable();
80
+ }
81
+ catch { // cxt-ignore: error_swallow,exception_hiding — unknown/unconfigured provider treated as unavailable
82
+ available = false;
83
+ }
84
+ if (provider === 'claude') {
85
+ // claude = the `claude -p` CLI wrapper; isAvailable() is just `which claude`.
86
+ // PATH presence ≠ logged in, so guide explicitly instead of claiming "configured".
87
+ if (available)
88
+ console.log(' ✓ `claude` on PATH. If not logged in yet, run `claude` once to authenticate.');
89
+ else
90
+ console.log(' `claude` not found. Install: npm i -g @anthropic-ai/claude-code, then run `claude` to log in.');
91
+ return { doAuthNow: false, plan: null };
92
+ }
93
+ if (available) {
94
+ console.log(` ✓ ${provider} already configured.`);
95
+ return { doAuthNow: false, plan: authPlanFor(provider) };
96
+ }
97
+ if (provider === 'codex') {
98
+ console.log(' `codex` not found. Install the OpenAI Codex CLI and ensure `codex` is on PATH.');
99
+ return { doAuthNow: false, plan: null };
100
+ }
101
+ if (provider === 'lmstudio' || provider === 'local') {
102
+ console.log(` No ${provider} server detected — start it (LM Studio :1234 / Ollama :11434) before running.`);
103
+ return { doAuthNow: false, plan: null };
104
+ }
105
+ const plan = authPlanFor(provider);
106
+ if (plan) {
107
+ const doAuthNow = await confirm({
108
+ message: ` ${provider} needs login — run \`auth login --provider ${plan.providerArg}\` now?`,
109
+ default: true,
110
+ });
111
+ return { doAuthNow, plan };
112
+ }
113
+ return { doAuthNow: false, plan: null };
114
+ }
115
+ /**
116
+ * Interactive Linear setup: paste API key → arrow-key pick teams (multi) → pick
117
+ * THIS repo's project → write LINEAR_* env + an openswarm.json mapping so the
118
+ * daemon resolves this repo without fuzzy name matching. Falls back to manual
119
+ * team-id entry if the Linear API can't be reached.
120
+ */
121
+ async function setupLinear(envVars, cwd) {
122
+ // OAuth (browser, no key to paste) vs personal API key.
123
+ const method = await select({
124
+ message: ' Linear authentication:',
125
+ choices: [
126
+ { name: 'OAuth (browser login)', value: 'oauth', description: 'no API key to paste — recommended' },
127
+ { name: 'API key (paste)', value: 'apikey', description: 'personal key from linear.app/settings/api' },
128
+ ],
129
+ });
130
+ let cred;
131
+ if (method === 'oauth') {
132
+ try {
133
+ const authStore = new AuthProfileStore();
134
+ let token;
135
+ if (authStore.getProfile('linear:default')) {
136
+ token = await ensureValidToken(authStore, 'linear:default'); // reuse — no browser
137
+ console.log(' ✓ Reusing existing Linear OAuth profile.');
138
+ }
139
+ else {
140
+ token = await loginAndSaveLinearProfile(); // browser PKCE → linear:default profile
141
+ }
142
+ cred = { accessToken: token };
143
+ }
144
+ catch (err) { // cxt-ignore: error_swallow,exception_hiding — OAuth failure → API-key fallback
145
+ console.log(` ⚠ Linear OAuth failed (${err.message}). Falling back to API key.`);
146
+ const apiKey = (await password({ message: ' LINEAR_API_KEY (hidden):' })).trim();
147
+ if (!apiKey) {
148
+ console.log(' Skipped Linear (no key).');
149
+ return;
150
+ }
151
+ envVars.LINEAR_API_KEY = apiKey;
152
+ cred = { apiKey };
153
+ }
154
+ }
155
+ else {
156
+ console.log(' Get a key at https://linear.app/settings/api');
157
+ const apiKey = (await password({ message: ' LINEAR_API_KEY (hidden):' })).trim();
158
+ if (!apiKey) {
159
+ console.log(' Skipped Linear (no key).');
160
+ return;
161
+ }
162
+ envVars.LINEAR_API_KEY = apiKey;
163
+ cred = { apiKey };
164
+ }
165
+ let teams = [];
166
+ try {
167
+ teams = await listTeams(cred);
168
+ }
169
+ catch (err) { // cxt-ignore: error_swallow,exception_hiding — surfaced to the user + manual team-id fallback
170
+ console.log(` ⚠ Could not fetch teams (${err.message}). Enter the team id manually.`);
171
+ }
172
+ if (teams.length === 0) {
173
+ const tid = (await input({ message: ' LINEAR_TEAM_ID:' })).trim();
174
+ if (tid)
175
+ envVars.LINEAR_TEAM_ID = tid;
176
+ return;
177
+ }
178
+ // One repo = one team. (Multi-team daemon watch lives in the main
179
+ // ~/.config/openswarm config, not per-repo init — keeps this picker simple.)
180
+ const mapTeamId = await select({
181
+ message: ` Linear team for "${basename(cwd)}":`,
182
+ choices: teams.map((t) => ({ name: `${t.key} — ${t.name}`, value: t.id })),
183
+ });
184
+ envVars.LINEAR_TEAM_ID = mapTeamId;
185
+ let projects = [];
186
+ try {
187
+ projects = await listProjects(mapTeamId, cred);
188
+ }
189
+ catch (err) { // cxt-ignore: error_swallow,exception_hiding — surfaced to the user; repo mapping skipped
190
+ console.log(` ⚠ Could not fetch projects (${err.message}).`);
191
+ return;
192
+ }
193
+ if (projects.length === 0) {
194
+ console.log(' No projects in that team — skipping repo mapping.');
195
+ return;
196
+ }
197
+ const repoName = basename(cwd);
198
+ const projectId = await select({
199
+ message: ` Linear project for "${repoName}":`,
200
+ choices: [
201
+ { name: '(skip — no repo mapping)', value: '' },
202
+ ...projects.map((p) => ({ name: p.name, value: p.id })),
203
+ ],
204
+ });
205
+ if (!projectId)
206
+ return;
207
+ const proj = projects.find((p) => p.id === projectId);
208
+ const team = teams.find((t) => t.id === mapTeamId);
209
+ const filePath = await saveRepoMetadata(cwd, {
210
+ schemaVersion: 1,
211
+ projectName: proj?.name,
212
+ linear: {
213
+ teamId: mapTeamId,
214
+ teamKey: team?.key,
215
+ projectId,
216
+ projectName: proj?.name,
217
+ },
218
+ });
219
+ console.log(` Wrote ${filePath} → ${team?.key ?? '?'}/${proj?.name ?? projectId}`);
220
+ }
221
+ export async function runInitWizard(opts = {}) {
222
+ const cwd = process.cwd();
223
+ const configPath = join(cwd, 'config.yaml');
224
+ const envPath = join(cwd, '.env');
225
+ if (existsSync(configPath)) {
226
+ // Guard: if cwd/config.yaml is a symlink into the daemon's global config
227
+ // (~/.config/openswarm), `init` here would clobber the running daemon's
228
+ // settings (agents, allowedProjects, …). Refuse even with --force.
229
+ let symlinkTarget = null;
230
+ try {
231
+ if (lstatSync(configPath).isSymbolicLink())
232
+ symlinkTarget = realpathSync(configPath);
233
+ }
234
+ catch {
235
+ symlinkTarget = null; // cxt-ignore: error_swallow — stat failure → treat as a plain file
236
+ }
237
+ if (symlinkTarget && symlinkTarget.startsWith(join(homedir(), '.config', 'openswarm'))) {
238
+ console.error(`config.yaml is a symlink to the daemon's global config:\n ${symlinkTarget}`);
239
+ console.error('Running `init` here would overwrite your running daemon configuration.');
240
+ console.error('Run init in a different repo, or edit the daemon config directly.');
241
+ process.exit(1);
242
+ }
243
+ if (!opts.force) {
244
+ console.error('config.yaml already exists. Use --force to overwrite, or edit it directly.');
245
+ process.exit(1);
246
+ }
247
+ }
248
+ const envVars = {};
249
+ let provider = 'codex';
250
+ let taskBackend = 'local';
251
+ let notify = 'none';
252
+ let doAuthNow = false;
253
+ let plan = null;
254
+ try {
255
+ console.log(banner('first-run setup'));
256
+ // 1) AI provider
257
+ provider = await select({
258
+ message: '1) AI provider for worker/reviewer:',
259
+ choices: PROVIDER_CHOICES.map((c) => ({ name: c.name, value: c.value, description: c.description })),
260
+ });
261
+ ({ doAuthNow, plan } = await bootstrapProvider(provider));
262
+ // 2) Task backend
263
+ taskBackend = await select({
264
+ message: '\n2) Task backend:',
265
+ choices: [
266
+ { name: 'local', value: 'local', description: 'Local SQLite issue store (~/.openswarm/issues.db) — no account' },
267
+ { name: 'linear', value: 'linear', description: 'Linear (arrow-key team/project picker)' },
268
+ ],
269
+ });
270
+ if (taskBackend === 'linear')
271
+ await setupLinear(envVars, cwd);
272
+ // 3) Notification channel
273
+ notify = await select({
274
+ message: '\n3) Notification channel (optional):',
275
+ choices: NOTIFY_CHOICES.map((c) => ({ name: c.name, value: c.value, description: c.description })),
276
+ });
277
+ if (notify === 'discord') {
278
+ envVars.DISCORD_TOKEN = (await password({ message: ' DISCORD_TOKEN (hidden):' })).trim();
279
+ envVars.DISCORD_CHANNEL_ID = (await input({ message: ' DISCORD_CHANNEL_ID:' })).trim();
280
+ }
281
+ else if (notify === 'slack') {
282
+ envVars.SLACK_WEBHOOK_URL = (await input({ message: ' SLACK_WEBHOOK_URL:' })).trim();
283
+ }
284
+ else if (notify === 'telegram') {
285
+ envVars.TELEGRAM_BOT_TOKEN = (await password({ message: ' TELEGRAM_BOT_TOKEN (hidden):' })).trim();
286
+ envVars.TELEGRAM_CHAT_ID = (await input({ message: ' TELEGRAM_CHAT_ID:' })).trim();
287
+ }
288
+ else if (notify === 'webhook') {
289
+ envVars.NOTIFY_WEBHOOK_URL = (await input({ message: ' NOTIFY_WEBHOOK_URL:' })).trim();
290
+ }
291
+ }
292
+ catch (err) {
293
+ // @inquirer throws ExitPromptError on Ctrl-C — exit cleanly, no stack trace.
294
+ if (err instanceof Error && err.name === 'ExitPromptError') {
295
+ console.log('\nSetup cancelled.');
296
+ return;
297
+ }
298
+ throw err;
299
+ }
300
+ // Drop empty answers so we never write `KEY=` for a skipped field.
301
+ for (const k of Object.keys(envVars)) {
302
+ if (!envVars[k])
303
+ delete envVars[k];
304
+ }
305
+ // Write .env (secrets) + config.yaml.
306
+ if (Object.keys(envVars).length > 0) {
307
+ writeEnvVars(envPath, envVars);
308
+ console.log(`\nWrote ${envPath} (${Object.keys(envVars).join(', ')}) — chmod 600.`);
309
+ }
310
+ writeFileSync(configPath, buildWizardConfig(provider, notify, { name: basename(cwd), projectPath: cwd }), 'utf-8');
311
+ console.log(`Wrote ${configPath}.`);
312
+ // Inline auth last (browser OAuth) — after all prompts.
313
+ if (doAuthNow && plan) {
314
+ console.log(`\nLaunching login for ${plan.providerArg}...`);
315
+ const { handleAuthLogin } = await import('./authHandler.js');
316
+ await handleAuthLogin(plan.providerArg, {});
317
+ }
318
+ // Next steps.
319
+ console.log('\nNext steps:');
320
+ console.log(' 1. Edit config.yaml — set your project path(s) under `agents:`.');
321
+ if (plan && !doAuthNow) {
322
+ const store = new AuthProfileStore();
323
+ if (store.getProfile(plan.profileKey) === null) {
324
+ console.log(` 2. Authenticate: openswarm auth login --provider ${plan.providerArg}`);
325
+ }
326
+ }
327
+ console.log(' • Diagnose: openswarm doctor (verify providers, native deps, ports, config)');
328
+ console.log(' • Validate: openswarm validate');
329
+ console.log(' • Start: openswarm start (or `openswarm` for the TUI)');
330
+ if (taskBackend === 'local') {
331
+ console.log(' • Task backend: local SQLite (~/.openswarm/issues.db) — no Linear account needed.');
332
+ }
333
+ }
334
+ //# sourceMappingURL=initWizard.js.map