@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
@@ -0,0 +1,8 @@
1
+ import { LocalModelAdapter } from './local.js';
2
+ import type { CliRunOptions, CliRunResult } from './types.js';
3
+ export declare class LmStudioAdapter extends LocalModelAdapter {
4
+ constructor();
5
+ run(options: CliRunOptions): Promise<CliRunResult>;
6
+ private resolveModel;
7
+ }
8
+ //# sourceMappingURL=lmstudio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lmstudio.d.ts","sourceRoot":"","sources":["../../src/adapters/lmstudio.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS9D,qBAAa,eAAgB,SAAQ,iBAAiB;;IAY9C,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YAK1C,YAAY;CAO3B"}
@@ -0,0 +1,41 @@
1
+ // ============================================
2
+ // OpenSwarm - LM Studio Adapter
3
+ // Created: 2026-05-13
4
+ // Purpose: Dedicated OpenAI-compatible adapter for LM Studio local server
5
+ // Dependencies: LocalModelAdapter
6
+ // Test Status: Covered by src/adapters/lmstudio.test.ts
7
+ // ============================================
8
+ import { LocalModelAdapter } from './local.js';
9
+ const DEFAULT_LMSTUDIO_BASE_URL = 'http://localhost:1234';
10
+ const DEFAULT_LMSTUDIO_MODEL = 'local-model';
11
+ function normalizeBaseUrl(url) {
12
+ return url.replace(/\/+$/, '');
13
+ }
14
+ export class LmStudioAdapter extends LocalModelAdapter {
15
+ constructor() {
16
+ super({
17
+ name: 'lmstudio',
18
+ endpoints: [normalizeBaseUrl(process.env.LMSTUDIO_BASE_URL ?? DEFAULT_LMSTUDIO_BASE_URL)],
19
+ defaultModel: normalizeValue(process.env.LMSTUDIO_MODEL) ?? DEFAULT_LMSTUDIO_MODEL,
20
+ apiKey: process.env.LMSTUDIO_API_KEY,
21
+ logPrefix: 'LMStudio',
22
+ noServerMessage: 'No LM Studio server found. Start LM Studio Local Server first, or set LMSTUDIO_BASE_URL.',
23
+ });
24
+ }
25
+ async run(options) {
26
+ const model = await this.resolveModel(options.model);
27
+ return super.run({ ...options, model });
28
+ }
29
+ async resolveModel(requestedModel) {
30
+ const explicitModel = normalizeValue(requestedModel) ?? normalizeValue(process.env.LMSTUDIO_MODEL);
31
+ if (explicitModel)
32
+ return explicitModel;
33
+ const loadedModels = await this.listModels();
34
+ return loadedModels[0] ?? DEFAULT_LMSTUDIO_MODEL;
35
+ }
36
+ }
37
+ function normalizeValue(value) {
38
+ const trimmed = value?.trim();
39
+ return trimmed ? trimmed : undefined;
40
+ }
41
+ //# sourceMappingURL=lmstudio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lmstudio.js","sourceRoot":"","sources":["../../src/adapters/lmstudio.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,gCAAgC;AAChC,sBAAsB;AACtB,0EAA0E;AAC1E,kCAAkC;AAClC,wDAAwD;AACxD,+CAA+C;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAC1D,MAAM,sBAAsB,GAAG,aAAa,CAAC;AAE7C,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,eAAgB,SAAQ,iBAAiB;IACpD;QACE,KAAK,CAAC;YACJ,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,yBAAyB,CAAC,CAAC;YACzF,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,sBAAsB;YAClF,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;YACpC,SAAS,EAAE,UAAU;YACrB,eAAe,EAAE,0FAA0F;SAC5G,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAsB;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,cAAuB;QAChD,MAAM,aAAa,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnG,IAAI,aAAa;YAAE,OAAO,aAAa,CAAC;QAExC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,sBAAsB,CAAC;IACnD,CAAC;CACF;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC"}
@@ -1,9 +1,23 @@
1
1
  import type { CliAdapter, CliRunOptions, CliRunResult, AdapterCapabilities, WorkerResult, ReviewResult } from './types.js';
2
+ export interface LocalModelAdapterOptions {
3
+ name?: string;
4
+ endpoints?: string[];
5
+ defaultModel?: string;
6
+ apiKey?: string;
7
+ logPrefix?: string;
8
+ noServerMessage?: string;
9
+ }
2
10
  export declare class LocalModelAdapter implements CliAdapter {
3
- readonly name = "local";
11
+ readonly name: string;
4
12
  readonly capabilities: AdapterCapabilities;
5
13
  private activeUrl;
6
14
  private configuredUrl;
15
+ private readonly endpoints;
16
+ private readonly defaultModel;
17
+ private readonly apiKey?;
18
+ private readonly logPrefix;
19
+ private readonly noServerMessage;
20
+ constructor(options?: LocalModelAdapterOptions);
7
21
  /** config.yaml에서 baseUrl을 주입받을 때 사용 */
8
22
  setBaseUrl(url: string): void;
9
23
  isAvailable(): Promise<boolean>;
@@ -25,6 +39,7 @@ export declare class LocalModelAdapter implements CliAdapter {
25
39
  * 로컬 API 호출 함수 생성 (에이전틱 루프에 주입)
26
40
  */
27
41
  private createApiCaller;
42
+ private buildHeaders;
28
43
  parseWorkerOutput(raw: CliRunResult): WorkerResult;
29
44
  parseReviewerOutput(raw: CliRunResult): ReviewResult;
30
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/adapters/local.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAepB,qBAAa,iBAAkB,YAAW,UAAU;IAClD,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAGF,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAE5C,uCAAuC;IACvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAqBrC,6BAA6B;IAC7B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,sBAAsB;IAChB,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBrC,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAIpE,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA4DxD;;;OAGG;YACW,gBAAgB;IAqC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoCvB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAKlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAIrD"}
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/adapters/local.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAgBpB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,iBAAkB,YAAW,UAAU;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAGF,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,OAAO,GAAE,wBAA6B;IASlD,uCAAuC;IACvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBrC,6BAA6B;IAC7B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,sBAAsB;IAChB,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBrC,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAIpE,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkExD;;;OAGG;YACW,gBAAgB;IAqC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,YAAY;IAQpB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAIlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAGrD"}
@@ -3,8 +3,9 @@
3
3
  // Created: 2026-04-10
4
4
  // Purpose: Ollama, LMStudio, llama.cpp 등 로컬 OpenAI 호환 서버 지원
5
5
  // ============================================
6
- import { t } from '../locale/index.js';
7
6
  import { runAgenticLoop, loopResultToCliResult } from './agenticLoop.js';
7
+ import { parseWorkerResult, parseReviewerResult } from './resultParsing.js';
8
+ import { consumeChatCompletionsStream } from './chatStream.js';
8
9
  // 로컬 프로바이더 기본 URL 후보 (우선순위 순)
9
10
  const DEFAULT_ENDPOINTS = [
10
11
  'http://localhost:11434', // Ollama
@@ -14,7 +15,7 @@ const DEFAULT_ENDPOINTS = [
14
15
  const DEFAULT_MODEL = 'gemma3:4b';
15
16
  const HEALTH_CHECK_TIMEOUT_MS = 2000;
16
17
  export class LocalModelAdapter {
17
- name = 'local';
18
+ name;
18
19
  capabilities = {
19
20
  supportsStreaming: false,
20
21
  supportsJsonOutput: true,
@@ -25,17 +26,31 @@ export class LocalModelAdapter {
25
26
  // 활성 서버 URL (isAvailable에서 감지, run에서 사용)
26
27
  activeUrl = null;
27
28
  configuredUrl = null;
29
+ endpoints;
30
+ defaultModel;
31
+ apiKey;
32
+ logPrefix;
33
+ noServerMessage;
34
+ constructor(options = {}) {
35
+ this.name = options.name ?? 'local';
36
+ this.endpoints = options.endpoints ?? DEFAULT_ENDPOINTS;
37
+ this.defaultModel = options.defaultModel ?? DEFAULT_MODEL;
38
+ this.apiKey = options.apiKey;
39
+ this.logPrefix = options.logPrefix ?? 'Local';
40
+ this.noServerMessage = options.noServerMessage ?? 'No local model server found. Start Ollama, LMStudio, or llama.cpp server first.';
41
+ }
28
42
  /** config.yaml에서 baseUrl을 주입받을 때 사용 */
29
43
  setBaseUrl(url) {
30
44
  this.configuredUrl = url;
31
45
  }
32
46
  async isAvailable() {
33
47
  const candidates = this.configuredUrl
34
- ? [this.configuredUrl, ...DEFAULT_ENDPOINTS]
35
- : DEFAULT_ENDPOINTS;
48
+ ? [this.configuredUrl, ...this.endpoints]
49
+ : this.endpoints;
36
50
  for (const url of candidates) {
37
51
  try {
38
52
  const res = await fetch(`${url}/v1/models`, {
53
+ headers: this.buildHeaders(),
39
54
  signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),
40
55
  });
41
56
  if (res.ok) {
@@ -62,6 +77,7 @@ export class LocalModelAdapter {
62
77
  }
63
78
  try {
64
79
  const res = await fetch(`${this.activeUrl}/v1/models`, {
80
+ headers: this.buildHeaders(),
65
81
  signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),
66
82
  });
67
83
  if (!res.ok)
@@ -85,18 +101,18 @@ export class LocalModelAdapter {
85
101
  return {
86
102
  exitCode: 1,
87
103
  stdout: '',
88
- stderr: 'No local model server found. Start Ollama, LMStudio, or llama.cpp server first.\n' +
89
- `Checked: ${(this.configuredUrl ? [this.configuredUrl, ...DEFAULT_ENDPOINTS] : DEFAULT_ENDPOINTS).join(', ')}`,
104
+ stderr: `${this.noServerMessage}\n` +
105
+ `Checked: ${(this.configuredUrl ? [this.configuredUrl, ...this.endpoints] : this.endpoints).join(', ')}`,
90
106
  durationMs: Date.now() - startTime,
91
107
  };
92
108
  }
93
109
  }
94
- const model = options.model ?? DEFAULT_MODEL;
110
+ const model = options.model ?? this.defaultModel;
95
111
  const baseUrl = this.activeUrl;
96
112
  // 도구 지원 여부 감지 (모델에 따라 다를 수 있음)
97
113
  const supportsTools = await this.checkToolSupport(baseUrl, model);
98
114
  // 에이전틱 루프로 실행
99
- const callApi = this.createApiCaller(baseUrl, model);
115
+ const callApi = this.createApiCaller(baseUrl, model, options.onToken, options.signal);
100
116
  const loopOptions = {
101
117
  systemPrompt: options.systemPrompt,
102
118
  prompt: options.prompt,
@@ -106,13 +122,19 @@ export class LocalModelAdapter {
106
122
  maxTurns: options.maxTurns ?? 15,
107
123
  timeoutMs: options.timeoutMs || 300000,
108
124
  onLog: options.onLog,
109
- enableTools: supportsTools,
125
+ enableTools: (options.enableTools ?? true) && supportsTools,
126
+ nudgeMaxOnNoEdit: options.nudgeMaxOnNoEdit,
127
+ protectedFiles: options.protectedFiles,
128
+ bashTimeoutMs: options.bashTimeoutMs,
129
+ webTools: options.webTools,
130
+ mcpTools: options.mcpTools,
131
+ signal: options.signal,
110
132
  };
111
133
  try {
112
134
  const result = await runAgenticLoop(loopOptions);
113
135
  if (options.onLog) {
114
136
  const toolInfo = supportsTools ? `${result.toolCallCount} tool uses` : 'no tools';
115
- options.onLog(`[Local] ${result.apiCallCount} API calls, ${toolInfo}, ${result.totalTokens} tokens`);
137
+ options.onLog(`[${this.logPrefix}] ${result.apiCallCount} API calls, ${toolInfo}, ${result.totalTokens} tokens`);
116
138
  }
117
139
  return loopResultToCliResult(result);
118
140
  }
@@ -152,7 +174,7 @@ export class LocalModelAdapter {
152
174
  try {
153
175
  const res = await fetch(`${baseUrl}/v1/chat/completions`, {
154
176
  method: 'POST',
155
- headers: { 'Content-Type': 'application/json' },
177
+ headers: this.buildHeaders(),
156
178
  body: JSON.stringify({
157
179
  model,
158
180
  messages: [{ role: 'user', content: 'hi' }],
@@ -171,21 +193,23 @@ export class LocalModelAdapter {
171
193
  /**
172
194
  * 로컬 API 호출 함수 생성 (에이전틱 루프에 주입)
173
195
  */
174
- createApiCaller(baseUrl, model) {
196
+ createApiCaller(baseUrl, model, onToken, signal) {
175
197
  return async (messages, tools) => {
176
198
  const body = {
177
199
  model,
178
200
  messages,
179
201
  temperature: 0.2,
180
- stream: false,
202
+ stream: true,
203
+ stream_options: { include_usage: true },
181
204
  };
182
205
  if (tools.length > 0) {
183
206
  body.tools = tools;
184
207
  }
185
208
  const res = await fetch(`${baseUrl}/v1/chat/completions`, {
186
209
  method: 'POST',
187
- headers: { 'Content-Type': 'application/json' },
210
+ headers: this.buildHeaders(),
188
211
  body: JSON.stringify(body),
212
+ signal,
189
213
  });
190
214
  if (!res.ok) {
191
215
  const errText = await res.text().catch(() => '');
@@ -198,124 +222,24 @@ export class LocalModelAdapter {
198
222
  }
199
223
  throw new Error(`Local API error (${res.status}): ${errText.slice(0, 500)}`);
200
224
  }
201
- return (await res.json());
225
+ return consumeChatCompletionsStream(res, onToken);
202
226
  };
203
227
  }
228
+ buildHeaders() {
229
+ const headers = { 'Content-Type': 'application/json' };
230
+ if (this.apiKey) {
231
+ headers.Authorization = `Bearer ${this.apiKey}`;
232
+ }
233
+ return headers;
234
+ }
204
235
  parseWorkerOutput(raw) {
205
- const text = raw.stdout;
206
- return extractWorkerResultJson(text) ?? extractWorkerFromText(text);
236
+ return parseWorkerResult(raw.stdout);
207
237
  }
208
238
  parseReviewerOutput(raw) {
209
- const text = raw.stdout;
210
- return extractReviewerResultJson(text) ?? extractReviewerFromText(text);
211
- }
212
- }
213
- // Worker/Reviewer 출력 파싱 (GPT 어댑터와 동일 로직)
214
- function extractWorkerResultJson(text) {
215
- const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
216
- const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"success"');
217
- if (!jsonStr)
218
- return null;
219
- try {
220
- const parsed = JSON.parse(jsonStr);
221
- return {
222
- success: Boolean(parsed.success),
223
- summary: parsed.summary || t('common.fallback.noSummary'),
224
- filesChanged: Array.isArray(parsed.filesChanged) ? parsed.filesChanged : [],
225
- commands: Array.isArray(parsed.commands) ? parsed.commands : [],
226
- output: text,
227
- error: parsed.error,
228
- confidencePercent: typeof parsed.confidencePercent === 'number'
229
- ? parsed.confidencePercent : undefined,
230
- haltReason: parsed.haltReason || undefined,
231
- };
232
- }
233
- catch {
234
- return null;
235
- }
236
- }
237
- function extractWorkerFromText(text) {
238
- const hasError = /error|fail|exception|cannot/i.test(text);
239
- const hasSuccess = /success|completed|done|finished/i.test(text);
240
- return {
241
- success: !hasError || hasSuccess,
242
- summary: extractSummary(text),
243
- filesChanged: [],
244
- commands: [],
245
- output: text,
246
- error: hasError ? extractErrorMessage(text) : undefined,
247
- };
248
- }
249
- function extractReviewerResultJson(text) {
250
- const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
251
- const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"decision"');
252
- if (!jsonStr)
253
- return null;
254
- try {
255
- const parsed = JSON.parse(jsonStr);
256
- const decision = parsed.decision === 'approve' || parsed.decision === 'reject'
257
- ? parsed.decision
258
- : 'revise';
259
- return {
260
- decision,
261
- feedback: typeof parsed.feedback === 'string' ? parsed.feedback : t('common.fallback.noSummary'),
262
- issues: Array.isArray(parsed.issues)
263
- ? parsed.issues.filter((v) => typeof v === 'string')
264
- : [],
265
- suggestions: Array.isArray(parsed.suggestions)
266
- ? parsed.suggestions.filter((v) => typeof v === 'string')
267
- : [],
268
- };
269
- }
270
- catch {
271
- return null;
272
- }
273
- }
274
- function extractReviewerFromText(text) {
275
- const lower = text.toLowerCase();
276
- const decision = lower.includes('approve')
277
- ? 'approve'
278
- : lower.includes('reject')
279
- ? 'reject'
280
- : 'revise';
281
- return {
282
- decision,
283
- feedback: extractSummary(text),
284
- issues: [],
285
- suggestions: [],
286
- };
287
- }
288
- function findJsonObject(text, marker) {
289
- const idx = text.indexOf(marker);
290
- if (idx < 0)
291
- return null;
292
- let start = text.lastIndexOf('{', idx);
293
- if (start < 0)
294
- return null;
295
- let depth = 0;
296
- for (let i = start; i < text.length; i++) {
297
- if (text[i] === '{')
298
- depth++;
299
- if (text[i] === '}') {
300
- depth--;
301
- if (depth === 0)
302
- return text.slice(start, i + 1);
303
- }
239
+ return parseReviewerResult(raw.stdout);
304
240
  }
305
- return null;
306
- }
307
- function extractSummary(text) {
308
- const lines = text.split('\n').filter(l => l.trim().length > 10);
309
- if (lines.length === 0)
310
- return t('common.fallback.noSummary');
311
- const summary = lines[0].trim();
312
- return summary.length > 200 ? `${summary.slice(0, 200)}...` : summary;
313
- }
314
- function extractErrorMessage(text) {
315
- const errorMatch = text.match(/(?:error|exception|failed?):\s*(.+)/i);
316
- if (errorMatch)
317
- return errorMatch[1].slice(0, 200);
318
- const lines = text.split('\n').filter(l => /error|fail/i.test(l));
319
- return lines.length > 0 ? lines[0].slice(0, 200) : 'Unknown error';
320
241
  }
242
+ // Streamed chat/completions responses are parsed by consumeChatCompletionsStream.
243
+ // Worker/Reviewer output parsing lives in ./resultParsing.ts (shared with the
244
+ // gpt, openrouter, and codex adapters — INT-1441).
321
245
  //# sourceMappingURL=local.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/adapters/local.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/adapters/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { CliAdapter, CliRunOptions, CliRunResult, AdapterCapabilities, WorkerResult, ReviewResult } from './types.js';
2
+ import { type ChatMessage } from './agenticLoop.js';
3
+ import type { ToolDefinition } from './tools.js';
4
+ export declare class OpenRouterCliAdapter implements CliAdapter {
5
+ readonly name = "openrouter";
6
+ readonly capabilities: AdapterCapabilities;
7
+ isAvailable(): Promise<boolean>;
8
+ buildCommand(_options: CliRunOptions): {
9
+ command: string;
10
+ args: string[];
11
+ };
12
+ run(options: CliRunOptions): Promise<CliRunResult>;
13
+ parseWorkerOutput(raw: CliRunResult): WorkerResult;
14
+ parseReviewerOutput(raw: CliRunResult): ReviewResult;
15
+ }
16
+ export interface ApiCallerOptions {
17
+ /** worker 등 기계적 역할: 추론 토큰 비활성화 (지원 모델 한정) */
18
+ disableReasoning?: boolean;
19
+ /** 스트리밍 토큰 콜백 (chat TUI). 없으면 비스트리밍과 동일하게 동작. */
20
+ onToken?: (delta: string) => void;
21
+ /** 사용자 중단(Esc/Ctrl+C) — fetch에 전달. */
22
+ signal?: AbortSignal;
23
+ }
24
+ export declare function createApiCaller(apiKey: string, model: string, opts?: ApiCallerOptions): (messages: ChatMessage[], tools: ToolDefinition[]) => Promise<import("./chatStream.js").ChatCompletionLike>;
25
+ /**
26
+ * Prompt caching breakpoint 삽입.
27
+ *
28
+ * OpenAI/Gemini 모델은 OpenRouter가 자동 캐싱하므로 메시지를 건드리지 않는다.
29
+ * Anthropic 모델은 명시적 cache_control breakpoint가 필요하다 — 매 API 호출마다
30
+ * 전체 히스토리가 재전송되는데, 시스템 프롬프트 + 직전 누적 히스토리는 턴마다
31
+ * 거의 동일하므로 그 경계에 ephemeral 캐시 마커를 두면 입력 토큰이 ~90% 할인된다.
32
+ *
33
+ * breakpoint 2개: (1) 시스템 메시지 끝, (2) 마지막 user/tool 메시지 직전 경계.
34
+ * Anthropic은 최대 4개 breakpoint를 허용하므로 2개는 안전하다.
35
+ */
36
+ export declare function applyPromptCaching(messages: ChatMessage[], model: string): unknown[];
37
+ //# sourceMappingURL=openrouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/adapters/openrouter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkBjD,qBAAa,oBAAqB,YAAW,UAAU;IACrD,QAAQ,CAAC,IAAI,gBAAgB;IAE7B,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAEI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAUrC,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAKpE,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA4DxD,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAIlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAGrD;AAKD,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sCAAsC;IACtC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,IAC1E,UAAU,WAAW,EAAE,EAAE,OAAO,cAAc,EAAE,2DA8C/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAwBpF"}
@@ -0,0 +1,193 @@
1
+ // ============================================
2
+ // OpenSwarm - OpenRouter CLI Adapter
3
+ // Calls the OpenRouter Chat Completions API (OpenAI-compatible schema)
4
+ // using a stored sk-or-* key from `openswarm auth login --provider openrouter`.
5
+ // ============================================
6
+ import { AuthProfileStore, ensureValidToken } from '../auth/index.js';
7
+ import { runAgenticLoop, loopResultToCliResult, } from './agenticLoop.js';
8
+ import { parseWorkerResult, parseReviewerResult } from './resultParsing.js';
9
+ import { consumeChatCompletionsStream } from './chatStream.js';
10
+ const OPENROUTER_API_BASE = 'https://openrouter.ai/api/v1';
11
+ const DEFAULT_MODEL = 'openai/gpt-5';
12
+ const PROFILE_KEY = 'openrouter:default';
13
+ /** OPENROUTER_API_KEY env var (legacy: OPENROUTER_API) → immediate API key (no PKCE needed). */
14
+ function getEnvApiKey() {
15
+ return process.env.OPENROUTER_API_KEY?.trim() || process.env.OPENROUTER_API?.trim() || undefined;
16
+ }
17
+ // Attribution headers — OpenRouter surfaces these in its analytics UI so
18
+ // model providers can see traffic originating from OpenSwarm.
19
+ const ATTRIBUTION_HEADERS = {
20
+ 'HTTP-Referer': 'https://github.com/unohee/openswarm',
21
+ 'X-Title': 'OpenSwarm',
22
+ };
23
+ export class OpenRouterCliAdapter {
24
+ name = 'openrouter';
25
+ capabilities = {
26
+ supportsStreaming: false,
27
+ supportsJsonOutput: true,
28
+ supportsModelSelection: true,
29
+ managedGit: false,
30
+ supportedSkills: [],
31
+ };
32
+ async isAvailable() {
33
+ if (getEnvApiKey())
34
+ return true;
35
+ try {
36
+ const store = new AuthProfileStore();
37
+ return store.getProfile(PROFILE_KEY) !== null;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ buildCommand(_options) {
44
+ // 어댑터가 직접 fetch하므로 spawn 진입점은 미사용.
45
+ return { command: 'echo', args: ['"OpenRouter adapter uses run() — not shell spawn"'] };
46
+ }
47
+ async run(options) {
48
+ const startTime = Date.now();
49
+ // Prefer OPENROUTER_API_KEY env var (auto-loaded from .env by the CLI entrypoint)
50
+ let apiKey = getEnvApiKey();
51
+ if (!apiKey) {
52
+ const store = new AuthProfileStore();
53
+ try {
54
+ apiKey = await ensureValidToken(store, PROFILE_KEY);
55
+ }
56
+ catch (err) {
57
+ return {
58
+ exitCode: 1,
59
+ stdout: '',
60
+ stderr: `Auth error: ${err instanceof Error ? err.message : String(err)}. Set OPENROUTER_API_KEY env var or run: openswarm auth login --provider openrouter`,
61
+ durationMs: Date.now() - startTime,
62
+ };
63
+ }
64
+ }
65
+ const model = options.model ?? DEFAULT_MODEL;
66
+ const callApi = createApiCaller(apiKey, model, {
67
+ disableReasoning: options.disableReasoning,
68
+ onToken: options.onToken,
69
+ signal: options.signal,
70
+ });
71
+ const loopOptions = {
72
+ systemPrompt: options.systemPrompt,
73
+ prompt: options.prompt,
74
+ cwd: options.cwd ?? process.cwd(),
75
+ model,
76
+ callApi,
77
+ maxTurns: options.maxTurns ?? 20,
78
+ timeoutMs: options.timeoutMs || 300000,
79
+ onLog: options.onLog,
80
+ enableTools: options.enableTools ?? true,
81
+ nudgeMaxOnNoEdit: options.nudgeMaxOnNoEdit,
82
+ protectedFiles: options.protectedFiles,
83
+ bashTimeoutMs: options.bashTimeoutMs,
84
+ webTools: options.webTools,
85
+ mcpTools: options.mcpTools,
86
+ signal: options.signal,
87
+ };
88
+ try {
89
+ const result = await runAgenticLoop(loopOptions);
90
+ options.onLog?.(`[OpenRouter] ${result.apiCallCount} API calls, ${result.toolCallCount} tool uses, ${result.totalTokens} tokens`);
91
+ return loopResultToCliResult(result);
92
+ }
93
+ catch (err) {
94
+ return {
95
+ exitCode: 1,
96
+ stdout: '',
97
+ stderr: `OpenRouter agentic loop failed: ${err instanceof Error ? err.message : String(err)}`,
98
+ durationMs: Date.now() - startTime,
99
+ };
100
+ }
101
+ }
102
+ parseWorkerOutput(raw) {
103
+ return parseWorkerResult(raw.stdout);
104
+ }
105
+ parseReviewerOutput(raw) {
106
+ return parseReviewerResult(raw.stdout);
107
+ }
108
+ }
109
+ export function createApiCaller(apiKey, model, opts = {}) {
110
+ return async (messages, tools) => {
111
+ const body = {
112
+ model,
113
+ messages: applyPromptCaching(messages, model),
114
+ temperature: 0.2,
115
+ max_tokens: 16384,
116
+ stream: true,
117
+ stream_options: { include_usage: true },
118
+ };
119
+ // ZDR(Zero Data Retention) — 데이터를 보존하지 않는 provider로만 라우팅.
120
+ // 단, OpenAI provider는 data_collection:deny 플래그를 거부("Provider returned
121
+ // error")하므로 제외한다. OpenAI는 API 데이터를 학습에 쓰지 않아(정책상) ZDR
122
+ // 강제가 불필요하다. non-OpenAI 모델에만 적용한다.
123
+ if (!/^openai\//i.test(model)) {
124
+ body.provider = { data_collection: 'deny' };
125
+ }
126
+ // 추론 불필요 역할은 reasoning 토큰을 끈다. glm-4.7-flash처럼 non-thinking
127
+ // 모델엔 무영향, 추론형 모델(glm-5 등)을 worker로 바꿔도 토큰 낭비를 막는다.
128
+ // 단, OpenAI 추론 모델(gpt-5 등)은 "Reasoning is mandatory"로 이 플래그를
129
+ // 거부하므로 제외한다 — worker escalate 대상이 gpt-5라 이걸 안 빼면 escalation이
130
+ // 항상 깨진다. OpenAI는 단순 작업엔 추론을 자동 최소화하므로 끌 필요도 없다.
131
+ if (opts.disableReasoning && !/^openai\//i.test(model)) {
132
+ body.reasoning = { enabled: false };
133
+ }
134
+ if (tools.length > 0) {
135
+ body.tools = tools;
136
+ }
137
+ const res = await fetch(`${OPENROUTER_API_BASE}/chat/completions`, {
138
+ method: 'POST',
139
+ headers: {
140
+ Authorization: `Bearer ${apiKey}`,
141
+ 'Content-Type': 'application/json',
142
+ ...ATTRIBUTION_HEADERS,
143
+ },
144
+ body: JSON.stringify(body),
145
+ signal: opts.signal,
146
+ });
147
+ if (!res.ok) {
148
+ const errText = await res.text().catch(() => '');
149
+ throw new Error(`OpenRouter API error (${res.status}): ${errText.slice(0, 500)}`);
150
+ }
151
+ return consumeChatCompletionsStream(res, opts.onToken);
152
+ };
153
+ }
154
+ /**
155
+ * Prompt caching breakpoint 삽입.
156
+ *
157
+ * OpenAI/Gemini 모델은 OpenRouter가 자동 캐싱하므로 메시지를 건드리지 않는다.
158
+ * Anthropic 모델은 명시적 cache_control breakpoint가 필요하다 — 매 API 호출마다
159
+ * 전체 히스토리가 재전송되는데, 시스템 프롬프트 + 직전 누적 히스토리는 턴마다
160
+ * 거의 동일하므로 그 경계에 ephemeral 캐시 마커를 두면 입력 토큰이 ~90% 할인된다.
161
+ *
162
+ * breakpoint 2개: (1) 시스템 메시지 끝, (2) 마지막 user/tool 메시지 직전 경계.
163
+ * Anthropic은 최대 4개 breakpoint를 허용하므로 2개는 안전하다.
164
+ */
165
+ export function applyPromptCaching(messages, model) {
166
+ // OpenAI/Gemini 등은 자동 캐싱 — 변환 불필요 (cache_control을 넣으면 거부될 수 있음)
167
+ if (!/anthropic\/|claude/i.test(model)) {
168
+ return messages;
169
+ }
170
+ // 캐시 마커를 달 인덱스: 시스템 메시지(있으면) + 마지막 직전 메시지.
171
+ // 마지막 메시지(가장 최근 tool 결과)는 매 턴 바뀌므로 캐시하지 않는다.
172
+ const cacheable = new Set();
173
+ if (messages[0]?.role === 'system')
174
+ cacheable.add(0);
175
+ if (messages.length >= 2)
176
+ cacheable.add(messages.length - 2);
177
+ return messages.map((m, i) => {
178
+ if (!cacheable.has(i) || typeof m.content !== 'string' || !m.content) {
179
+ return m;
180
+ }
181
+ // string content → content-part 배열로 변환하며 마지막 파트에 cache_control 부착
182
+ return {
183
+ ...m,
184
+ content: [
185
+ { type: 'text', text: m.content, cache_control: { type: 'ephemeral' } },
186
+ ],
187
+ };
188
+ });
189
+ }
190
+ // ----- Worker/Reviewer output parsing (mirrors gpt.ts) -----
191
+ // Worker/Reviewer output parsing lives in ./resultParsing.ts (shared with the
192
+ // gpt, local, and codex adapters — INT-1441).
193
+ //# sourceMappingURL=openrouter.js.map