@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
package/README.md CHANGED
@@ -3,33 +3,28 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@intrect/openswarm.svg)](https://www.npmjs.com/package/@intrect/openswarm)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/@intrect/openswarm.svg)](https://www.npmjs.com/package/@intrect/openswarm)
5
5
  [![license](https://img.shields.io/npm/l/@intrect/openswarm.svg)](LICENSE)
6
- [![ko-fi](https://img.shields.io/badge/Ko--fi-support-FF5E5B?logo=ko-fi&logoColor=white)](https://ko-fi.com/unohee)
6
+ [![SWE-bench Lite](https://img.shields.io/badge/SWE--bench_Lite-hybrid_3%2F3_resolved-2ea44f)](benchmarks/RUBRIC.md)
7
+ [![GitHub Discussions](https://img.shields.io/github/discussions/unohee/OpenSwarm?logo=github&label=discussions)](https://github.com/unohee/OpenSwarm/discussions)
7
8
 
8
- > Autonomous AI agent orchestrator — Claude, GPT, Codex, and local models (Ollama/LMStudio/llama.cpp)
9
+ > Autonomous AI agent orchestrator — Claude, GPT, Codex, **OpenRouter (any model)**, and local models (Ollama/LMStudio/llama.cpp)
9
10
 
10
- ## Sponsor
11
-
12
- OpenSwarm is developed and maintained in my spare time by a single author.
13
- If the project saves you time or money, please consider chipping in —
14
- it directly funds ongoing updates, bug fixes, and new adapters.
15
-
16
- [![Support on Ko-fi](https://img.shields.io/badge/Support%20on-Ko--fi-FF5E5B?logo=ko-fi&logoColor=white&style=for-the-badge)](https://ko-fi.com/unohee)
17
-
18
- One-off contributions are perfectly fine — there is no subscription
19
- tier and no feature is paywalled. Thank you.
11
+ > 💬 **Help shape OpenSwarm.** Share feature ideas, vote on the roadmap, and ask questions in [**GitHub Discussions**](https://github.com/unohee/OpenSwarm/discussions). The roadmap is built in the open — your feedback decides what ships next.
20
12
 
21
13
  ---
22
14
 
23
- OpenSwarm orchestrates multiple AI agents as autonomous code workers. It picks up Linear issues, runs Worker/Reviewer pair pipelines, reports to Discord, and retains long-term memory via LanceDB. Supports Claude Code, OpenAI GPT, Codex, and **local open-source models** via Ollama, LMStudio, or llama.cpp.
15
+ OpenSwarm orchestrates multiple AI agents as autonomous code workers. It picks up Linear issues, runs Worker/Reviewer pair pipelines, reports to Discord, and retains long-term memory via LanceDB. Workers run on Claude Code, OpenAI GPT, Codex, **any OpenRouter model**, or **local open-source models** (Ollama, LMStudio, llama.cpp) — with cost-aware routing measured on an L0–L6 benchmark ladder.
16
+
17
+ **Verified on real GitHub issues**: the agentic harness solves SWE-bench Lite instances graded by the official harness. Hybrid mode — a frontier model diagnoses read-only, a lightweight model implements with a verification loop — resolved **3/3 attempted instances** that every single lightweight model had failed, at a fraction of frontier-only cost. Workers also **learn each repository over time**: task outcomes are stored as per-repo knowledge and recalled into future prompts. ([benchmark rubric & results](benchmarks/RUBRIC.md))
24
18
 
25
19
  ## Quick Start
26
20
 
27
21
  ```bash
28
22
  npm install -g @intrect/openswarm
29
- openswarm
23
+ openswarm auth login # one-time provider setup — ChatGPT (codex/gpt) OAuth
24
+ openswarm # launches the TUI chat
30
25
  ```
31
26
 
32
- That's it. `openswarm` with no arguments launches the TUI chat interface immediately.
27
+ `openswarm` with no arguments launches the TUI chat. You need **one provider** first: `openswarm auth login` (ChatGPT OAuth, used by `codex`/`gpt`), or `openswarm auth login --provider openrouter` / `export OPENROUTER_API_KEY=…`, or just have an authenticated `claude` on PATH. Check what's wired with `openswarm auth status`.
33
28
 
34
29
  ![TUI Chat Interface](screenshots/tui.png)
35
30
 
@@ -56,7 +51,7 @@ openswarm chat [session] # Simple readline chat
56
51
  openswarm start # Start full daemon (requires config.yaml)
57
52
  openswarm run "Fix the bug" -p ~/my-project # Run a single task
58
53
  openswarm exec "Run tests" --local --pipeline # Execute via daemon
59
- openswarm init # Generate config.yaml scaffold
54
+ openswarm init # Interactive setup wizard (provider, task backend, config)
60
55
  openswarm validate # Validate config.yaml
61
56
 
62
57
  # Code Registry & BS Detector
@@ -93,11 +88,13 @@ For autonomous operation (Linear issue processing, Discord control, PR auto-impr
93
88
  ### Prerequisites
94
89
 
95
90
  - **Node.js** >= 22
96
- - **Claude Code CLI** authenticated (`claude -p`) — default provider
97
- - **OpenAI Codex CLI** (`codex exec`) optional alternative provider
98
- - **Discord Bot** token with message content intent
99
- - **Linear** API key and team ID
100
- - **GitHub CLI** (`gh`) for CI monitoring (optional)
91
+ - **At least one LLM provider** (default `codex`):
92
+ - **OpenAI Codex** — default. `openswarm auth login` (ChatGPT OAuth) or a `codex` binary on PATH
93
+ - **OpenRouter** `OPENROUTER_API_KEY`, or `openswarm auth login --provider openrouter`
94
+ - **Claude Code CLI** (`claude -p`) opt-in fallback; an authenticated `claude` on PATH (used when codex hits its usage limit or OpenRouter is unavailable)
95
+ - **Local** (Ollama / LM Studio / llama.cpp) auto-detected, no auth
96
+ - **Native build toolchain** — `better-sqlite3` and `@lancedb/lancedb` are native modules. Prebuilt binaries cover common platforms; if yours lacks one, `npm install` builds from source and needs `python3` + a C/C++ toolchain (`build-essential` on Linux, Xcode Command Line Tools on macOS)
97
+ - **For autonomous mode only** (optional): **Linear** API key + team ID, **Discord** bot token (message content intent), **GitHub CLI** (`gh`) for CI monitoring
101
98
 
102
99
  ### Configuration
103
100
 
@@ -133,19 +130,23 @@ LINEAR_TEAM_ID=your-linear-team-id
133
130
  ### CLI Adapter (Provider)
134
131
 
135
132
  ```yaml
136
- adapter: claude # "claude" | "codex" | "gpt" | "local"
133
+ adapter: codex # default. "codex" | "openrouter" | "gpt" | "local" | "lmstudio" | "claude"
137
134
  ```
138
135
 
139
136
  Switch at runtime via Discord: `!provider codex` / `!provider claude`
140
137
 
141
138
  | Adapter | Backend | Models | Auth |
142
139
  |---------|---------|--------|------|
143
- | `claude` | Claude Code CLI | sonnet-4, haiku-4.5, opus-4 | CLI auth |
144
- | `codex` | OpenAI Codex CLI | o3, o4-mini | CLI auth |
140
+ | `codex` | OpenAI Codex CLI | o3, o4-mini | OAuth PKCE / CLI auth |
141
+ | `claude` | Claude Code CLI (`claude -p`) — opt-in fallback | sonnet-4, haiku-4.5, opus-4 | CLI auth |
145
142
  | `gpt` | OpenAI API | gpt-4o, o3, gpt-4.1 | OAuth PKCE |
143
+ | `openrouter` | OpenRouter API (native agentic loop) | any OpenRouter model — gpt-5, gemini-2.5-flash, deepseek, glm, qwen, … | OAuth PKCE or `OPENROUTER_API_KEY` |
146
144
  | `local` | Ollama / LMStudio / llama.cpp | gemma4, llama3, mistral, qwen, etc. | None |
145
+ | `lmstudio` | LM Studio OpenAI-compatible API | loaded LM Studio model (`LMSTUDIO_MODEL`) | Optional API key |
146
+
147
+ The `openrouter` adapter runs OpenSwarm's own agentic tool loop (read/search/edit/bash with verification guards), enables ZDR (`data_collection: deny`) for non-OpenAI models, and applies Anthropic prompt caching automatically.
147
148
 
148
- Local models are auto-detected on standard ports (Ollama `:11434`, LMStudio `:1234`, llama.cpp `:8080`).
149
+ Local models are auto-detected on standard ports (Ollama `:11434`, LMStudio `:1234`, llama.cpp `:8080`). Use `lmstudio` for a dedicated LM Studio endpoint (`LMSTUDIO_BASE_URL`, default `http://localhost:1234`).
149
150
 
150
151
  Per-role adapter overrides:
151
152
 
@@ -250,13 +251,15 @@ docker compose up -d # Docker
250
251
 
251
252
  ## Features
252
253
 
253
- - **Multi-Provider Adapters** — Pluggable adapter system: **Claude Code**, **OpenAI GPT/Codex**, and **local models** (Ollama, LMStudio, llama.cpp) with runtime provider switching
254
+ - **Multi-Provider Adapters** — Pluggable adapter system: **Claude Code**, **OpenAI GPT/Codex**, **OpenRouter** (any model, native agentic loop), and **local models** (Ollama, LMStudio, llama.cpp) with runtime provider switching
254
255
  - **Code Registry** — SQLite-backed entity registry tracking every function/class/type across 8 languages, with complexity scoring, test mapping, and risk assessment
255
256
  - **BS Detector** — Built-in static analysis engine that detects bad code patterns (empty catch, hardcoded secrets, `as any`, etc.) with pipeline guard integration
256
257
  - **Autonomous Pipeline** — Cron-driven heartbeat fetches Linear issues, runs Worker/Reviewer pair loops, and updates issue state automatically
257
258
  - **Worker/Reviewer Pairs** — Multi-iteration code generation with automated review, testing, and documentation stages
258
259
  - **Decision Engine** — Scope validation, rate limiting, priority-based task selection, and workflow mapping
259
260
  - **Cognitive Memory** — LanceDB vector store with Xenova/multilingual-e5-base embeddings for long-term recall across sessions
261
+ - **Repo Knowledge Loop** — workers learn each repository over time: task outcomes (success patterns, review-rejection pitfalls) are stored per-repo and recalled into the next worker prompt
262
+ - **SWE-bench Verified** — the agentic harness solves real SWE-bench Lite issues, graded by the official harness; hybrid mode (frontier diagnosis + lightweight implementer) resolved 3/3 attempted instances ([benchmarks/RUBRIC.md](benchmarks/RUBRIC.md))
260
263
  - **Knowledge Graph** — Static code analysis, dependency mapping, impact analysis, and file-level conflict detection across concurrent tasks
261
264
  - **Discord Control** — Full command interface for monitoring, task dispatch, scheduling, provider switching, and pair session management
262
265
  - **Rich TUI Chat** — Claude Code inspired terminal interface with tabs, streaming responses, and geek-themed loading messages
@@ -294,6 +297,23 @@ Memory types: `belief` · `strategy` · `user_model` · `system_pattern` · `con
294
297
 
295
298
  Background: decay, consolidation, contradiction detection, distillation.
296
299
 
300
+ **Repo knowledge loop** — every completed task writes repo-scoped knowledge
301
+ (success → `system_pattern` with files changed + approach, review rejection →
302
+ `constraint` pitfall), and the next task on the same repo recalls the most
303
+ relevant entries into the worker prompt as a "Repository Knowledge" section.
304
+ Workers get better at a codebase the more they work on it.
305
+
306
+ ### Benchmarks (L0–L6)
307
+
308
+ `benchmarks/` contains a difficulty ladder for routing models by measured
309
+ capability — synthetic L0–L5 tasks with deterministic grading, and L6 = real
310
+ GitHub issues (SWE-bench Lite) solved by the OpenSwarm harness and graded by
311
+ the official swebench harness. Headline: **hybrid mode** (frontier read-only
312
+ diagnosis + lightweight implementer with a verification loop) resolved 3/3
313
+ attempted instances that every single lightweight model had failed. See
314
+ [benchmarks/RUBRIC.md](benchmarks/RUBRIC.md) for the rubric, measured results,
315
+ and the harness defects the benchmark uncovered.
316
+
297
317
  ---
298
318
 
299
319
  ## Discord Commands
@@ -3,9 +3,15 @@
3
3
  # Copy this file to config.yaml to use
4
4
 
5
5
  # Default CLI adapter for worker/reviewer stages
6
- # Options: claude, codex, gpt, local
7
- # For GPT: run `openswarm auth login --provider gpt` first
6
+ # Options: claude, codex, gpt, local, lmstudio, openrouter
7
+ # For GPT: run `openswarm auth login --provider gpt`
8
+ # (uses the public Codex OAuth client by default — no extra config needed)
9
+ # For OpenRouter: run `openswarm auth login --provider openrouter`
10
+ # (PKCE browser flow → stores a sk-or-* API key; falls back to manual paste)
8
11
  # For local: start Ollama, LMStudio, or llama.cpp server
12
+ # For lmstudio: start LM Studio Local Server (default http://localhost:1234)
13
+ # Optional env: LMSTUDIO_BASE_URL, LMSTUDIO_MODEL, LMSTUDIO_API_KEY
14
+ # If LMSTUDIO_MODEL is unset, the adapter auto-selects the first loaded model.
9
15
  adapter: claude
10
16
 
11
17
  discord:
@@ -49,7 +55,7 @@ autonomous:
49
55
  decomposition:
50
56
  enabled: true # Enable decomposition
51
57
  thresholdMinutes: 30 # Decompose if estimated time exceeds this
52
- plannerModel: claude-sonnet-4-20250514 # Planner model
58
+ plannerModel: claude-opus-4-7 # Planner model (Opus for deep decomposition)
53
59
 
54
60
  # Per-role settings
55
61
  # Hybrid config: Claude for complex coding, local model for review/docs ($0)
@@ -57,15 +63,15 @@ autonomous:
57
63
  worker:
58
64
  enabled: true
59
65
  adapter: claude
60
- model: claude-sonnet-4-20250514 # Sonnet for coding tasks
61
- escalateModel: claude-opus-4-6 # On failure: Opus
66
+ model: claude-sonnet-4-6 # Sonnet for coding tasks
67
+ escalateModel: claude-opus-4-7 # On failure: Opus
62
68
  escalateAfterIteration: 3
63
69
  timeoutMs: 1800000 # 30 minutes
64
70
  reviewer:
65
71
  enabled: true
66
72
  adapter: local # Local model — free, 7s response
67
73
  model: gemma-4-e4b-it # Gemma 4 e4b via LMStudio
68
- escalateModel: claude-sonnet-4-20250514 # Spot check: Sonnet reviews after N revisions
74
+ escalateModel: claude-sonnet-4-6 # Spot check: Sonnet reviews after N revisions
69
75
  escalateAfterIteration: 3 # Escalate from 3rd iteration
70
76
  timeoutMs: 60000 # 1 minute (local models are slower)
71
77
  tester:
@@ -88,13 +94,19 @@ autonomous:
88
94
 
89
95
  # Pipeline guards
90
96
  guards:
91
- qualityGate: true
97
+ qualityGate: true # bad-edit lint gate: tsc/ruff on changed files (blocking)
92
98
  fakeDataGuard: true
93
99
  conventionalCommits: true
94
100
  branchValidation: true
95
101
  uncertaintyDetection: true
96
102
  registryCheck: true
97
- bsDetector: true
103
+ bsDetector: true # blocks on critical code-smell patterns
104
+
105
+ # Self-repair reflection budget: max objective (lint/bs/test) failures tolerated
106
+ # before the loop gives up on bad edits. Lower it to cap token burn when
107
+ # reflection stops making progress; the loop also bails early on stagnation
108
+ # (identical errors twice in a row). Default: 3.
109
+ maxReflections: 3
98
110
 
99
111
  # Job profiles for lightweight vs heavy work
100
112
  jobProfiles:
@@ -105,8 +117,8 @@ autonomous:
105
117
  - name: deep-engineering
106
118
  minMinutes: 16
107
119
  roles:
108
- worker: claude-sonnet-4-20250514 # Sonnet for complex work
109
- reviewer: claude-sonnet-4-20250514 # Sonnet reviews Sonnet
120
+ worker: claude-sonnet-4-6 # Sonnet for complex work
121
+ reviewer: claude-sonnet-4-6 # Sonnet reviews Sonnet
110
122
 
111
123
  # Long-running task monitoring (RunPod training, batch processing, etc.)
112
124
  #
@@ -1,4 +1,4 @@
1
- import { type ToolDefinition } from './tools.js';
1
+ import { type ToolCall, type ToolDefinition } from './tools.js';
2
2
  import type { CliRunResult } from './types.js';
3
3
  /** OpenAI Chat Completions API 메시지 포맷 */
4
4
  export type ChatMessage = {
@@ -51,7 +51,7 @@ export interface AgenticLoopOptions {
51
51
  model: string;
52
52
  /** API 호출 함수 (어댑터별로 주입) */
53
53
  callApi: (messages: ChatMessage[], tools: ToolDefinition[]) => Promise<ChatCompletionResponse>;
54
- /** 최대 도구 사용 턴 수 (기본: 15) */
54
+ /** 최대 도구 사용 턴 수 (기본: 20) */
55
55
  maxTurns?: number;
56
56
  /** 전체 타임아웃 (ms, 기본: 300000) */
57
57
  timeoutMs?: number;
@@ -59,6 +59,29 @@ export interface AgenticLoopOptions {
59
59
  onLog?: (line: string) => void;
60
60
  /** 도구 사용 허용 여부 (기본: true) */
61
61
  enableTools?: boolean;
62
+ /** 토큰 기반 압축 트리거 임계값 (기본: 24000) */
63
+ compactTokenThreshold?: number;
64
+ /** 이 메시지 수를 넘어야 압축 후보 (VEGA compact_threshold, 기본: 24) */
65
+ compactAfterMessages?: number;
66
+ /** 압축 시 항상 원본 유지할 최근 메시지 수 (VEGA keep_recent, 기본: 8) */
67
+ keepRecentMessages?: number;
68
+ /**
69
+ * 수정이 필수인 작업의 no-edit 종료 가드. 모델이 edit/write 도구를 한 번도 안 쓰고
70
+ * 최종 텍스트로 끝내려 하면 "아직 수정 안 했다, 계속하라"고 N회까지 되민다.
71
+ * 경량 모델(gemini 등)이 탐색만 하고 일찍 결론 내는 패턴 차단 (SWE 하이브리드에서 발견).
72
+ * 기본 0 (비활성) — 수정 없는 작업(진단·분석)도 정상이므로 옵트인.
73
+ */
74
+ nudgeMaxOnNoEdit?: number;
75
+ /** Verification-harness files for which edit/write are refused (see tools.ts ToolExecOptions) */
76
+ protectedFiles?: string[];
77
+ /** bash tool timeout — docker-based tests need minutes (default 30s) */
78
+ bashTimeoutMs?: number;
79
+ /** Expose web_fetch + web_search tools (default true). Disabled e.g. for SWE-bench integrity. */
80
+ webTools?: boolean;
81
+ /** MCP tools (named `server__tool`) discovered from mcp.json, exposed alongside the native tools. */
82
+ mcpTools?: ToolDefinition[];
83
+ /** Abort the loop (checked each turn) — Esc/Ctrl+C in chat. */
84
+ signal?: AbortSignal;
62
85
  }
63
86
  /** 루프 실행 결과 */
64
87
  export interface AgenticLoopResult {
@@ -86,5 +109,25 @@ export declare function runAgenticLoop(options: AgenticLoopOptions): Promise<Age
86
109
  * AgenticLoopResult → CliRunResult 변환
87
110
  */
88
111
  export declare function loopResultToCliResult(result: AgenticLoopResult): CliRunResult;
112
+ /** Stable key for a tool call (name + args) — used to detect repeated calls. */
113
+ export declare function toolCallKey(tc: ToolCall): string;
114
+ /**
115
+ * True when every tool call this turn was already seen (same name+args), i.e.
116
+ * pure repetition with no new info or change — a stalled turn. Empty turns are
117
+ * not stalls (the model produced no tool calls, which ends the loop normally).
118
+ */
119
+ export declare function allToolCallsSeen(toolCalls: ToolCall[], seen: Set<string>): boolean;
120
+ /**
121
+ * 이전 턴(assistant+tool 쌍)을 요약 1줄로 교체.
122
+ * OpenAI API 제약: tool 메시지는 직전 assistant의 tool_call_id와 대응해야 하므로
123
+ * 오래된 assistant+tool 쌍은 텍스트 요약으로 대체해 API 오류를 방지.
124
+ *
125
+ * 보존 기준 (VEGA keep_recent): 최근 keepRecent개 메시지 블록은 항상 원본 유지.
126
+ * tool 메시지는 직전 assistant의 tool_call_id와 짝이 맞아야 하므로, 보존 경계는
127
+ * keepRecent 지점 이후 첫 assistant로 정렬해 짝이 깨진 tool 메시지가 남지 않게 한다.
128
+ * 기존 [Prior turns compacted] 요약이 있으면 새 요약에 합산 후 교체.
129
+ * (테스트를 위해 export — 외부에서 직접 호출할 일은 없음)
130
+ */
131
+ export declare function compactPriorTurns(messages: ChatMessage[], keepRecent?: number): void;
89
132
  export {};
90
133
  //# sourceMappingURL=agenticLoop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agenticLoop.d.ts","sourceRoot":"","sources":["../../src/adapters/agenticLoop.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACrH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,yCAAyC;AACzC,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,UAAU,sBAAsB;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YACvB,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;SAC5B,CAAC;QACF,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,iBAAiB;AACjB,MAAM,WAAW,kBAAkB;IACjC,eAAe;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU;IACV,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/F,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,6BAA6B;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAe;AACf,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0H5F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,YAAY,CAO7E"}
1
+ {"version":3,"file":"agenticLoop.d.ts","sourceRoot":"","sources":["../../src/adapters/agenticLoop.ts"],"names":[],"mappings":"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"}