claude-code-workflow 6.3.18 → 6.3.19

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 (822) hide show
  1. package/.claude/CLAUDE.md +8 -5
  2. package/.claude/agents/action-planning-agent.md +26 -2
  3. package/.claude/agents/code-developer.md +132 -43
  4. package/.claude/agents/debug-explore-agent.md +434 -0
  5. package/.claude/agents/test-fix-agent.md +14 -0
  6. package/.claude/commands/issue/discover.md +41 -0
  7. package/.claude/commands/issue/execute.md +200 -19
  8. package/.claude/commands/issue/new.md +1 -1
  9. package/.claude/commands/issue/plan.md +6 -1
  10. package/.claude/commands/issue/queue.md +94 -39
  11. package/.claude/commands/memory/swagger-docs.md +773 -0
  12. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  13. package/.claude/commands/workflow/execute.md +54 -34
  14. package/.claude/commands/workflow/lite-execute.md +48 -164
  15. package/.claude/commands/workflow/lite-fix.md +4 -4
  16. package/.claude/commands/workflow/lite-plan.md +5 -5
  17. package/.claude/commands/workflow/plan.md +27 -27
  18. package/.claude/commands/workflow/review.md +42 -17
  19. package/.claude/commands/workflow/tdd-plan.md +25 -25
  20. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  21. package/.claude/commands/workflow/test-gen.md +14 -14
  22. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  23. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  24. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  25. package/.claude/skills/ccw/SKILL.md +462 -0
  26. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  27. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  28. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  29. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  30. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  31. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  32. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  33. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  34. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  35. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  36. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  37. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  38. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  39. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  40. package/.claude/skills/ccw-help/SKILL.md +177 -0
  41. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  42. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  43. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  45. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  46. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  47. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  48. package/.claude/skills/code-reviewer/README.md +340 -0
  49. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  50. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  51. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  52. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  53. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  54. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  55. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  56. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  57. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  58. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  59. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  60. package/.claude/skills/skill-generator/SKILL.md +187 -0
  61. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  62. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  63. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  64. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  65. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  66. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  67. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  68. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  69. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  70. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  72. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  73. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  74. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  75. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  76. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  77. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  78. package/.claude/workflows/chinese-response.md +15 -28
  79. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  80. package/.claude/workflows/cli-tools-usage.md +221 -177
  81. package/.claude/workflows/windows-platform.md +13 -10
  82. package/.codex/prompts/issue-execute.md +305 -82
  83. package/.codex/prompts/issue-queue.md +22 -0
  84. package/.codex/prompts/lite-execute.md +36 -11
  85. package/README.md +309 -305
  86. package/ccw/README.md +10 -4
  87. package/ccw/dist/cli.d.ts.map +1 -1
  88. package/ccw/dist/cli.js +4 -1
  89. package/ccw/dist/cli.js.map +1 -1
  90. package/ccw/dist/commands/cli.d.ts.map +1 -1
  91. package/ccw/dist/commands/cli.js +131 -34
  92. package/ccw/dist/commands/cli.js.map +1 -1
  93. package/ccw/dist/commands/issue.d.ts +152 -0
  94. package/ccw/dist/commands/issue.d.ts.map +1 -1
  95. package/ccw/dist/commands/issue.js +550 -85
  96. package/ccw/dist/commands/issue.js.map +1 -1
  97. package/ccw/dist/commands/serve.d.ts +1 -0
  98. package/ccw/dist/commands/serve.d.ts.map +1 -1
  99. package/ccw/dist/commands/serve.js +12 -5
  100. package/ccw/dist/commands/serve.js.map +1 -1
  101. package/ccw/dist/commands/stop.d.ts.map +1 -1
  102. package/ccw/dist/commands/stop.js +29 -5
  103. package/ccw/dist/commands/stop.js.map +1 -1
  104. package/ccw/dist/commands/tool.d.ts.map +1 -1
  105. package/ccw/dist/commands/tool.js +19 -2
  106. package/ccw/dist/commands/tool.js.map +1 -1
  107. package/ccw/dist/commands/view.d.ts +1 -0
  108. package/ccw/dist/commands/view.d.ts.map +1 -1
  109. package/ccw/dist/commands/view.js +10 -3
  110. package/ccw/dist/commands/view.js.map +1 -1
  111. package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
  112. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
  113. package/ccw/dist/config/cli-settings-manager.js +392 -0
  114. package/ccw/dist/config/cli-settings-manager.js.map +1 -0
  115. package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
  116. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  117. package/ccw/dist/config/litellm-api-config-manager.js +290 -20
  118. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  119. package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
  120. package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
  121. package/ccw/dist/core/auth/csrf-manager.js +80 -0
  122. package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
  123. package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
  124. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
  125. package/ccw/dist/core/auth/csrf-middleware.js +141 -0
  126. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
  127. package/ccw/dist/core/auth/middleware.d.ts +15 -0
  128. package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
  129. package/ccw/dist/core/auth/middleware.js +76 -0
  130. package/ccw/dist/core/auth/middleware.js.map +1 -0
  131. package/ccw/dist/core/auth/token-manager.d.ts +41 -0
  132. package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
  133. package/ccw/dist/core/auth/token-manager.js +171 -0
  134. package/ccw/dist/core/auth/token-manager.js.map +1 -0
  135. package/ccw/dist/core/cache-manager.d.ts +6 -6
  136. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  137. package/ccw/dist/core/cache-manager.js +70 -48
  138. package/ccw/dist/core/cache-manager.js.map +1 -1
  139. package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
  140. package/ccw/dist/core/claude-freshness.js +23 -3
  141. package/ccw/dist/core/claude-freshness.js.map +1 -1
  142. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  143. package/ccw/dist/core/core-memory-store.js +2 -1
  144. package/ccw/dist/core/core-memory-store.js.map +1 -1
  145. package/ccw/dist/core/cors.d.ts +3 -0
  146. package/ccw/dist/core/cors.d.ts.map +1 -0
  147. package/ccw/dist/core/cors.js +10 -0
  148. package/ccw/dist/core/cors.js.map +1 -0
  149. package/ccw/dist/core/dashboard-generator-patch.js +0 -1
  150. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  151. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  152. package/ccw/dist/core/dashboard-generator.js +417 -416
  153. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  154. package/ccw/dist/core/data-aggregator.js +2 -2
  155. package/ccw/dist/core/data-aggregator.js.map +1 -1
  156. package/ccw/dist/core/lite-scanner.d.ts +1 -1
  157. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  158. package/ccw/dist/core/lite-scanner.js +130 -127
  159. package/ccw/dist/core/lite-scanner.js.map +1 -1
  160. package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
  161. package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
  162. package/ccw/dist/core/routes/auth-routes.js +80 -0
  163. package/ccw/dist/core/routes/auth-routes.js.map +1 -0
  164. package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
  165. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  166. package/ccw/dist/core/routes/ccw-routes.js +9 -4
  167. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  168. package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
  169. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  170. package/ccw/dist/core/routes/claude-routes.js +98 -39
  171. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  172. package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
  173. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  174. package/ccw/dist/core/routes/cli-routes.js +122 -43
  175. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  176. package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
  177. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
  178. package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
  179. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
  180. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
  181. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
  182. package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
  183. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
  184. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
  185. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
  186. package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
  187. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
  188. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
  189. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
  190. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
  191. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
  192. package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
  193. package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
  194. package/ccw/dist/core/routes/codexlens/utils.js +85 -0
  195. package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
  196. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
  197. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
  198. package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
  199. package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
  200. package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
  201. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  202. package/ccw/dist/core/routes/codexlens-routes.js +10 -981
  203. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  204. package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
  205. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
  206. package/ccw/dist/core/routes/discovery-routes.js +25 -0
  207. package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
  208. package/ccw/dist/core/routes/files-routes.d.ts +1 -14
  209. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  210. package/ccw/dist/core/routes/files-routes.js +57 -14
  211. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  212. package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
  213. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/graph-routes.js +36 -37
  215. package/ccw/dist/core/routes/graph-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/help-routes.d.ts +1 -14
  217. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
  218. package/ccw/dist/core/routes/help-routes.js +5 -0
  219. package/ccw/dist/core/routes/help-routes.js.map +1 -1
  220. package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
  221. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  222. package/ccw/dist/core/routes/hooks-routes.js +43 -21
  223. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  224. package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
  225. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  226. package/ccw/dist/core/routes/issue-routes.js +24 -0
  227. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  228. package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
  229. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  230. package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
  231. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  232. package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
  233. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
  234. package/ccw/dist/core/routes/litellm-routes.js +28 -11
  235. package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
  236. package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
  237. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  238. package/ccw/dist/core/routes/mcp-routes.js +99 -30
  239. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  240. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  241. package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
  242. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  243. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  244. package/ccw/dist/core/routes/memory-routes.js +74 -24
  245. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  246. package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
  247. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
  248. package/ccw/dist/core/routes/nav-status-routes.js +217 -0
  249. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
  250. package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
  251. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  252. package/ccw/dist/core/routes/rules-routes.js +481 -58
  253. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  254. package/ccw/dist/core/routes/session-routes.d.ts +1 -14
  255. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  256. package/ccw/dist/core/routes/session-routes.js +15 -3
  257. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  258. package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
  259. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  260. package/ccw/dist/core/routes/skills-routes.js +394 -112
  261. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  262. package/ccw/dist/core/routes/status-routes.d.ts +1 -14
  263. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  264. package/ccw/dist/core/routes/status-routes.js +4 -0
  265. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  266. package/ccw/dist/core/routes/system-routes.d.ts +4 -10
  267. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  268. package/ccw/dist/core/routes/system-routes.js +6 -4
  269. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  270. package/ccw/dist/core/routes/types.d.ts +19 -0
  271. package/ccw/dist/core/routes/types.d.ts.map +1 -0
  272. package/ccw/dist/core/routes/types.js +2 -0
  273. package/ccw/dist/core/routes/types.js.map +1 -0
  274. package/ccw/dist/core/server.d.ts.map +1 -1
  275. package/ccw/dist/core/server.js +201 -29
  276. package/ccw/dist/core/server.js.map +1 -1
  277. package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
  278. package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
  279. package/ccw/dist/core/services/api-key-tester.js +106 -0
  280. package/ccw/dist/core/services/api-key-tester.js.map +1 -0
  281. package/ccw/dist/core/services/health-check-service.d.ts +82 -0
  282. package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
  283. package/ccw/dist/core/services/health-check-service.js +271 -0
  284. package/ccw/dist/core/services/health-check-service.js.map +1 -0
  285. package/ccw/dist/core/websocket.d.ts +9 -7
  286. package/ccw/dist/core/websocket.d.ts.map +1 -1
  287. package/ccw/dist/core/websocket.js +9 -4
  288. package/ccw/dist/core/websocket.js.map +1 -1
  289. package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
  290. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  291. package/ccw/dist/tools/claude-cli-tools.js +490 -100
  292. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  293. package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
  294. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  295. package/ccw/dist/tools/cli-config-manager.js +76 -156
  296. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  297. package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
  298. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
  299. package/ccw/dist/tools/cli-executor-core.js +1310 -0
  300. package/ccw/dist/tools/cli-executor-core.js.map +1 -0
  301. package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
  302. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
  303. package/ccw/dist/tools/cli-executor-state.js +392 -0
  304. package/ccw/dist/tools/cli-executor-state.js.map +1 -0
  305. package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
  306. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
  307. package/ccw/dist/tools/cli-executor-utils.js +298 -0
  308. package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
  309. package/ccw/dist/tools/cli-executor.d.ts +3 -377
  310. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  311. package/ccw/dist/tools/cli-executor.js +3 -1884
  312. package/ccw/dist/tools/cli-executor.js.map +1 -1
  313. package/ccw/dist/tools/cli-history-store.d.ts +2 -0
  314. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  315. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  316. package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
  317. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
  318. package/ccw/dist/tools/cli-output-converter.js +1047 -0
  319. package/ccw/dist/tools/cli-output-converter.js.map +1 -0
  320. package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
  321. package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
  322. package/ccw/dist/tools/cli-prompt-builder.js +363 -0
  323. package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
  324. package/ccw/dist/tools/codex-lens.d.ts +15 -1
  325. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  326. package/ccw/dist/tools/codex-lens.js +289 -55
  327. package/ccw/dist/tools/codex-lens.js.map +1 -1
  328. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
  329. package/ccw/dist/tools/detect-changed-modules.js +22 -4
  330. package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
  331. package/ccw/dist/tools/index.d.ts.map +1 -1
  332. package/ccw/dist/tools/index.js +2 -0
  333. package/ccw/dist/tools/index.js.map +1 -1
  334. package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
  335. package/ccw/dist/tools/litellm-client.js +10 -4
  336. package/ccw/dist/tools/litellm-client.js.map +1 -1
  337. package/ccw/dist/tools/litellm-executor.d.ts +2 -4
  338. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  339. package/ccw/dist/tools/litellm-executor.js +39 -8
  340. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  341. package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
  342. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  343. package/ccw/dist/tools/native-session-discovery.js +197 -1
  344. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  345. package/ccw/dist/tools/session-manager.d.ts.map +1 -1
  346. package/ccw/dist/tools/session-manager.js +79 -0
  347. package/ccw/dist/tools/session-manager.js.map +1 -1
  348. package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
  349. package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
  350. package/ccw/dist/tools/skill-context-loader.js +198 -0
  351. package/ccw/dist/tools/skill-context-loader.js.map +1 -0
  352. package/ccw/dist/tools/smart-search.d.ts +8 -3
  353. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  354. package/ccw/dist/tools/smart-search.js +378 -75
  355. package/ccw/dist/tools/smart-search.js.map +1 -1
  356. package/ccw/dist/types/cli-settings.d.ts +86 -0
  357. package/ccw/dist/types/cli-settings.d.ts.map +1 -0
  358. package/ccw/dist/types/cli-settings.js +54 -0
  359. package/ccw/dist/types/cli-settings.js.map +1 -0
  360. package/ccw/dist/types/litellm-api-config.d.ts +40 -1
  361. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
  362. package/ccw/dist/utils/exec-constants.d.ts +25 -0
  363. package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
  364. package/ccw/dist/utils/exec-constants.js +25 -0
  365. package/ccw/dist/utils/exec-constants.js.map +1 -0
  366. package/ccw/dist/utils/path-resolver.d.ts +1 -0
  367. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  368. package/ccw/dist/utils/path-resolver.js +48 -3
  369. package/ccw/dist/utils/path-resolver.js.map +1 -1
  370. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  371. package/ccw/dist/utils/path-validator.js +25 -6
  372. package/ccw/dist/utils/path-validator.js.map +1 -1
  373. package/ccw/dist/utils/python-utils.d.ts.map +1 -1
  374. package/ccw/dist/utils/python-utils.js +27 -7
  375. package/ccw/dist/utils/python-utils.js.map +1 -1
  376. package/ccw/dist/utils/shell-escape.d.ts +8 -0
  377. package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
  378. package/ccw/dist/utils/shell-escape.js +24 -0
  379. package/ccw/dist/utils/shell-escape.js.map +1 -0
  380. package/ccw/dist/utils/uv-manager.d.ts +167 -0
  381. package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
  382. package/ccw/dist/utils/uv-manager.js +644 -0
  383. package/ccw/dist/utils/uv-manager.js.map +1 -0
  384. package/ccw/src/cli.ts +4 -1
  385. package/ccw/src/commands/cli.ts +132 -34
  386. package/ccw/src/commands/issue.ts +605 -91
  387. package/ccw/src/commands/serve.ts +15 -5
  388. package/ccw/src/commands/stop.ts +32 -5
  389. package/ccw/src/commands/tool.ts +17 -2
  390. package/ccw/src/commands/view.ts +13 -3
  391. package/ccw/src/config/cli-settings-manager.ts +460 -0
  392. package/ccw/src/config/litellm-api-config-manager.ts +392 -57
  393. package/ccw/src/core/auth/csrf-manager.ts +104 -0
  394. package/ccw/src/core/auth/csrf-middleware.ts +159 -0
  395. package/ccw/src/core/auth/middleware.ts +94 -0
  396. package/ccw/src/core/auth/token-manager.ts +219 -0
  397. package/ccw/src/core/cache-manager.ts +64 -52
  398. package/ccw/src/core/claude-freshness.ts +26 -6
  399. package/ccw/src/core/core-memory-store.ts +2 -1
  400. package/ccw/src/core/cors.ts +10 -0
  401. package/ccw/src/core/dashboard-generator-patch.ts +47 -48
  402. package/ccw/src/core/dashboard-generator.ts +797 -744
  403. package/ccw/src/core/data-aggregator.ts +667 -667
  404. package/ccw/src/core/lite-scanner.ts +156 -140
  405. package/ccw/src/core/routes/auth-routes.ts +98 -0
  406. package/ccw/src/core/routes/ccw-routes.ts +10 -20
  407. package/ccw/src/core/routes/claude-routes.ts +101 -51
  408. package/ccw/src/core/routes/cli-routes.ts +152 -55
  409. package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
  410. package/ccw/src/core/routes/codexlens/README.md +37 -0
  411. package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
  412. package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
  413. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
  414. package/ccw/src/core/routes/codexlens/utils.ts +96 -0
  415. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
  416. package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
  417. package/ccw/src/core/routes/discovery-routes.ts +1 -12
  418. package/ccw/src/core/routes/files-routes.ts +112 -40
  419. package/ccw/src/core/routes/graph-routes.ts +39 -46
  420. package/ccw/src/core/routes/help-routes.ts +2 -12
  421. package/ccw/src/core/routes/hooks-routes.ts +83 -44
  422. package/ccw/src/core/routes/issue-routes.ts +1 -12
  423. package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
  424. package/ccw/src/core/routes/litellm-routes.ts +35 -27
  425. package/ccw/src/core/routes/mcp-routes.ts +157 -60
  426. package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
  427. package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
  428. package/ccw/src/core/routes/memory-routes.ts +76 -22
  429. package/ccw/src/core/routes/nav-status-routes.ts +231 -0
  430. package/ccw/src/core/routes/rules-routes.ts +600 -81
  431. package/ccw/src/core/routes/session-routes.ts +28 -22
  432. package/ccw/src/core/routes/skills-routes.ts +452 -132
  433. package/ccw/src/core/routes/status-routes.ts +1 -12
  434. package/ccw/src/core/routes/system-routes.ts +15 -22
  435. package/ccw/src/core/routes/types.ts +25 -0
  436. package/ccw/src/core/server.ts +651 -468
  437. package/ccw/src/core/services/api-key-tester.ts +137 -0
  438. package/ccw/src/core/services/health-check-service.ts +340 -0
  439. package/ccw/src/core/websocket.ts +20 -12
  440. package/ccw/src/templates/dashboard-css/01-base.css +109 -0
  441. package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
  442. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
  443. package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
  444. package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
  445. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
  446. package/ccw/src/templates/dashboard-js/api.js +5 -0
  447. package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
  448. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
  449. package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
  450. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
  451. package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
  452. package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
  453. package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
  454. package/ccw/src/templates/dashboard-js/main.js +71 -0
  455. package/ccw/src/templates/dashboard-js/services.js +289 -0
  456. package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
  457. package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
  458. package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
  459. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
  460. package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
  461. package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
  462. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
  463. package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
  464. package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
  465. package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
  466. package/ccw/src/templates/dashboard.html +6 -0
  467. package/ccw/src/tools/README.md +29 -0
  468. package/ccw/src/tools/claude-cli-tools.ts +640 -125
  469. package/ccw/src/tools/cli-config-manager.ts +102 -172
  470. package/ccw/src/tools/cli-executor-core.ts +1533 -0
  471. package/ccw/src/tools/cli-executor-state.ts +560 -0
  472. package/ccw/src/tools/cli-executor-utils.ts +349 -0
  473. package/ccw/src/tools/cli-executor.ts +3 -2309
  474. package/ccw/src/tools/cli-history-store.ts +2 -0
  475. package/ccw/src/tools/cli-output-converter.ts +1237 -0
  476. package/ccw/src/tools/cli-prompt-builder.ts +487 -0
  477. package/ccw/src/tools/codex-lens.ts +324 -59
  478. package/ccw/src/tools/detect-changed-modules.ts +24 -6
  479. package/ccw/src/tools/index.ts +2 -0
  480. package/ccw/src/tools/litellm-client.ts +10 -4
  481. package/ccw/src/tools/litellm-executor.ts +146 -114
  482. package/ccw/src/tools/native-session-discovery.ts +209 -1
  483. package/ccw/src/tools/session-manager.ts +88 -0
  484. package/ccw/src/tools/skill-context-loader.ts +213 -0
  485. package/ccw/src/tools/smart-search.ts +427 -76
  486. package/ccw/src/types/cli-settings.ts +137 -0
  487. package/ccw/src/types/litellm-api-config.ts +55 -1
  488. package/ccw/src/utils/exec-constants.ts +24 -0
  489. package/ccw/src/utils/path-resolver.ts +49 -3
  490. package/ccw/src/utils/path-validator.ts +28 -6
  491. package/ccw/src/utils/python-utils.ts +140 -121
  492. package/ccw/src/utils/shell-escape.ts +30 -0
  493. package/ccw/src/utils/uv-manager.ts +796 -0
  494. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  495. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  496. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  497. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  498. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  499. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  500. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  501. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  502. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  503. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  504. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
  505. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
  506. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  507. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  508. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  509. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  510. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  511. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  512. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  513. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  514. package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
  515. package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
  516. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  517. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  518. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  519. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  520. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  521. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  522. package/codex-lens/pyproject.toml +43 -0
  523. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  524. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  525. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  526. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  527. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  528. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  529. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  530. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  531. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  532. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  533. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  534. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  535. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  536. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  537. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  538. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  539. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  540. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  541. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  542. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  543. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  544. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  545. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  546. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  547. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  548. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  549. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  550. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  551. package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
  552. package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
  553. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  554. package/codex-lens/src/codexlens/config.py +321 -12
  555. package/codex-lens/src/codexlens/entities.py +4 -1
  556. package/codex-lens/src/codexlens/env_config.py +298 -0
  557. package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
  558. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  559. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  560. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  561. package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
  562. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
  563. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  564. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  565. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  566. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  567. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  568. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  569. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  570. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  571. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  572. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  573. package/codex-lens/src/codexlens/parsers/factory.py +139 -10
  574. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
  575. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  576. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  577. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  578. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  579. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  580. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  581. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  582. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  583. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  584. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  585. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  586. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  587. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  588. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  589. package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
  590. package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
  591. package/codex-lens/src/codexlens/search/enrichment.py +21 -0
  592. package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
  593. package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
  594. package/codex-lens/src/codexlens/search/ranking.py +347 -8
  595. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
  596. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  597. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  598. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  599. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  600. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  601. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  602. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  603. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  604. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  605. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  606. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  624. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  625. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  626. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  627. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  628. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  629. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  630. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  650. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  651. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  652. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  653. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  654. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  655. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  656. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  657. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  658. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  659. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  660. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  661. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  662. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  681. package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
  682. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  683. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  684. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  691. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  692. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  693. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  694. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  695. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  696. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  697. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  698. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  699. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  700. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  701. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  702. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  703. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  704. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  705. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  706. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  707. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  708. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  709. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  710. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  717. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  718. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  719. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  720. package/package.json +4 -1
  721. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  722. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  723. package/.claude/skills/command-guide/SKILL.md +0 -388
  724. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  725. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  726. package/.claude/skills/command-guide/guides/examples.md +0 -537
  727. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  728. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  729. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  730. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  731. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  732. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  733. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  734. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  735. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  736. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  737. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  738. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  739. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  740. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  741. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  742. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  743. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  744. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  745. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  746. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  747. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  748. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  749. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  750. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  751. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  752. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  753. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  754. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  755. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  756. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  757. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  758. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  759. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  760. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  761. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  762. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  763. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  764. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  765. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  766. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  767. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  768. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  769. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  770. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  771. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  772. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  773. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  774. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  775. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  776. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  779. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  780. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  781. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  782. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  783. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  784. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  785. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  786. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  787. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  788. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  789. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  790. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  791. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  792. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  793. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  794. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  795. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  796. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  797. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  798. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  799. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  800. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  801. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  802. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  803. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  804. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  805. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  806. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  807. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  808. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  809. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  810. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  811. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  812. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  813. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  814. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  815. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  816. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  817. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  818. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  819. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  820. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  821. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  822. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -1,12 +1,44 @@
1
- // @ts-nocheck
2
1
  /**
3
2
  * LiteLLM API Routes Module
4
3
  * Handles LiteLLM provider management, endpoint configuration, and cache management
5
4
  */
6
- import type { IncomingMessage, ServerResponse } from 'http';
7
5
  import { fileURLToPath } from 'url';
8
6
  import { dirname, join as pathJoin } from 'path';
7
+ import { z } from 'zod';
9
8
  import { getSystemPython } from '../../utils/python-utils.js';
9
+ import {
10
+ UvManager,
11
+ isUvAvailable,
12
+ ensureUvInstalled,
13
+ createCodexLensUvManager
14
+ } from '../../utils/uv-manager.js';
15
+ import { ensureLiteLLMEmbedderReady } from '../../tools/codex-lens.js';
16
+ import type { RouteContext } from './types.js';
17
+
18
+ // ========== Input Validation Schemas ==========
19
+
20
+ /**
21
+ * Validation schema for ModelPoolConfig
22
+ * Used to validate incoming API requests for model pool operations
23
+ */
24
+ const ModelPoolConfigSchema = z.object({
25
+ modelType: z.enum(['embedding', 'llm', 'reranker']),
26
+ enabled: z.boolean(),
27
+ targetModel: z.string().min(1, 'Target model is required'),
28
+ strategy: z.enum(['round_robin', 'latency_aware', 'weighted_random']),
29
+ autoDiscover: z.boolean(),
30
+ excludedProviderIds: z.array(z.string()).optional().default([]),
31
+ defaultCooldown: z.number().int().min(0).default(60),
32
+ defaultMaxConcurrentPerKey: z.number().int().min(1).default(4),
33
+ name: z.string().optional(),
34
+ description: z.string().optional(),
35
+ });
36
+
37
+ /**
38
+ * Partial schema for updating ModelPoolConfig
39
+ * All fields are optional for PATCH-like updates
40
+ */
41
+ const ModelPoolConfigUpdateSchema = ModelPoolConfigSchema.partial();
10
42
 
11
43
  // Get current module path for package-relative lookups
12
44
  const __filename = fileURLToPath(import.meta.url);
@@ -40,6 +72,12 @@ import {
40
72
  getEmbeddingPoolConfig,
41
73
  updateEmbeddingPoolConfig,
42
74
  discoverProvidersForModel,
75
+ getModelPools,
76
+ getModelPool,
77
+ addModelPool,
78
+ updateModelPool,
79
+ deleteModelPool,
80
+ getAvailableModelsForType,
43
81
  type ProviderCredential,
44
82
  type CustomEndpoint,
45
83
  type ProviderType,
@@ -48,6 +86,7 @@ import {
48
86
  } from '../../config/litellm-api-config-manager.js';
49
87
  import { getContextCacheStore } from '../../tools/context-cache-store.js';
50
88
  import { getLiteLLMClient } from '../../tools/litellm-client.js';
89
+ import { testApiKeyConnection, getDefaultApiBase } from '../services/api-key-tester.js';
51
90
 
52
91
  // Cache for ccw-litellm status check
53
92
  let ccwLitellmStatusCache: {
@@ -66,14 +105,38 @@ export function clearCcwLitellmStatusCache() {
66
105
  ccwLitellmStatusCache.timestamp = 0;
67
106
  }
68
107
 
69
- export interface RouteContext {
70
- pathname: string;
71
- url: URL;
72
- req: IncomingMessage;
73
- res: ServerResponse;
74
- initialPath: string;
75
- handlePostRequest: (req: IncomingMessage, res: ServerResponse, handler: (body: unknown) => Promise<any>) => void;
76
- broadcastToClients: (data: unknown) => void;
108
+ /**
109
+ * Install ccw-litellm using UV package manager
110
+ * Delegates to ensureLiteLLMEmbedderReady for consistent dependency handling
111
+ * This ensures ccw-litellm installation doesn't break fastembed's onnxruntime dependencies
112
+ * @param _packagePath - Ignored, ensureLiteLLMEmbedderReady handles path discovery
113
+ * @returns Installation result
114
+ */
115
+ async function installCcwLitellmWithUv(_packagePath: string | null): Promise<{ success: boolean; message?: string; error?: string }> {
116
+ // Delegate to the robust installation logic in codex-lens.ts
117
+ // This ensures consistent dependency handling within the shared venv,
118
+ // preventing onnxruntime conflicts that would break fastembed
119
+ const result = await ensureLiteLLMEmbedderReady();
120
+ if (result.success) {
121
+ clearCcwLitellmStatusCache();
122
+ }
123
+ return result;
124
+ }
125
+
126
+ function sanitizeProviderForResponse(provider: any): any {
127
+ if (!provider) return provider;
128
+ return {
129
+ ...provider,
130
+ apiKey: '***',
131
+ apiKeys: Array.isArray(provider.apiKeys)
132
+ ? provider.apiKeys.map((entry: any) => ({ ...entry, key: '***' }))
133
+ : provider.apiKeys,
134
+ };
135
+ }
136
+
137
+ function sanitizeRotationEndpointForResponse(endpoint: any): any {
138
+ if (!endpoint) return endpoint;
139
+ return { ...endpoint, api_key: '***' };
77
140
  }
78
141
 
79
142
  // ===========================
@@ -83,11 +146,11 @@ export interface RouteContext {
83
146
  interface ModelInfo {
84
147
  id: string;
85
148
  name: string;
86
- provider: ProviderType;
149
+ provider: string;
87
150
  description?: string;
88
151
  }
89
152
 
90
- const PROVIDER_MODELS: Record<ProviderType, ModelInfo[]> = {
153
+ const PROVIDER_MODELS: Record<string, ModelInfo[]> = {
91
154
  openai: [
92
155
  { id: 'gpt-4-turbo', name: 'GPT-4 Turbo', provider: 'openai', description: '128K context' },
93
156
  { id: 'gpt-4', name: 'GPT-4', provider: 'openai', description: '8K context' },
@@ -132,7 +195,7 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
132
195
  // GET /api/litellm-api/providers - List all providers
133
196
  if (pathname === '/api/litellm-api/providers' && req.method === 'GET') {
134
197
  try {
135
- const providers = getAllProviders(initialPath);
198
+ const providers = getAllProviders(initialPath).map(sanitizeProviderForResponse);
136
199
  res.writeHead(200, { 'Content-Type': 'application/json' });
137
200
  res.end(JSON.stringify({ providers, count: providers.length }));
138
201
  } catch (err) {
@@ -153,13 +216,14 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
153
216
 
154
217
  try {
155
218
  const provider = addProvider(initialPath, providerData);
219
+ const sanitizedProvider = sanitizeProviderForResponse(provider);
156
220
 
157
221
  broadcastToClients({
158
222
  type: 'LITELLM_PROVIDER_CREATED',
159
- payload: { provider, timestamp: new Date().toISOString() }
223
+ payload: { provider: sanitizedProvider, timestamp: new Date().toISOString() }
160
224
  });
161
225
 
162
- return { success: true, provider };
226
+ return { success: true, provider: sanitizedProvider };
163
227
  } catch (err) {
164
228
  return { error: (err as Error).message, status: 500 };
165
229
  }
@@ -181,7 +245,7 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
181
245
  }
182
246
 
183
247
  res.writeHead(200, { 'Content-Type': 'application/json' });
184
- res.end(JSON.stringify(provider));
248
+ res.end(JSON.stringify(sanitizeProviderForResponse(provider)));
185
249
  } catch (err) {
186
250
  res.writeHead(500, { 'Content-Type': 'application/json' });
187
251
  res.end(JSON.stringify({ error: (err as Error).message }));
@@ -199,13 +263,14 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
199
263
 
200
264
  try {
201
265
  const provider = updateProvider(initialPath, providerId, updates);
266
+ const sanitizedProvider = sanitizeProviderForResponse(provider);
202
267
 
203
268
  broadcastToClients({
204
269
  type: 'LITELLM_PROVIDER_UPDATED',
205
- payload: { provider, timestamp: new Date().toISOString() }
270
+ payload: { provider: sanitizedProvider, timestamp: new Date().toISOString() }
206
271
  });
207
272
 
208
- return { success: true, provider };
273
+ return { success: true, provider: sanitizedProvider };
209
274
  } catch (err) {
210
275
  return { error: (err as Error).message, status: 404 };
211
276
  }
@@ -274,6 +339,201 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
274
339
  return true;
275
340
  }
276
341
 
342
+ // POST /api/litellm-api/providers/:id/test-key - Test specific API key
343
+ const providerTestKeyMatch = pathname.match(/^\/api\/litellm-api\/providers\/([^/]+)\/test-key$/);
344
+ if (providerTestKeyMatch && req.method === 'POST') {
345
+ const providerId = providerTestKeyMatch[1];
346
+
347
+ handlePostRequest(req, res, async (body: unknown) => {
348
+ const { keyId } = body as { keyId?: string };
349
+
350
+ if (!keyId) {
351
+ return { valid: false, error: 'keyId is required', status: 400 };
352
+ }
353
+
354
+ try {
355
+ const provider = getProvider(initialPath, providerId);
356
+
357
+ if (!provider) {
358
+ return { valid: false, error: 'Provider not found', status: 404 };
359
+ }
360
+
361
+ // Find the specific API key
362
+ let apiKeyValue: string | null = null;
363
+ let keyLabel = 'Default';
364
+
365
+ if (keyId === 'default' && provider.apiKey) {
366
+ // Use the single default apiKey
367
+ apiKeyValue = provider.apiKey;
368
+ } else if (provider.apiKeys && provider.apiKeys.length > 0) {
369
+ const keyEntry = provider.apiKeys.find(k => k.id === keyId);
370
+ if (keyEntry) {
371
+ apiKeyValue = keyEntry.key;
372
+ keyLabel = keyEntry.label || keyEntry.id;
373
+ }
374
+ }
375
+
376
+ if (!apiKeyValue) {
377
+ return { valid: false, error: 'API key not found' };
378
+ }
379
+
380
+ // Resolve environment variables
381
+ const { resolveEnvVar } = await import('../../config/litellm-api-config-manager.js');
382
+ const resolvedKey = resolveEnvVar(apiKeyValue);
383
+
384
+ if (!resolvedKey) {
385
+ return { valid: false, error: 'API key is empty or environment variable not set' };
386
+ }
387
+
388
+ // Determine API base URL
389
+ const apiBase = provider.apiBase || getDefaultApiBase(provider.type);
390
+
391
+ // Test the API key with appropriate endpoint based on provider type
392
+ const startTime = Date.now();
393
+ const testResult = await testApiKeyConnection(provider.type, apiBase, resolvedKey);
394
+ const latencyMs = Date.now() - startTime;
395
+
396
+ // Update key health status in provider config
397
+ if (provider.apiKeys && provider.apiKeys.length > 0) {
398
+ const keyEntry = provider.apiKeys.find(k => k.id === keyId);
399
+ if (keyEntry) {
400
+ keyEntry.healthStatus = testResult.valid ? 'healthy' : 'unhealthy';
401
+ keyEntry.lastHealthCheck = new Date().toISOString();
402
+ if (!testResult.valid) {
403
+ keyEntry.lastError = testResult.error;
404
+ } else {
405
+ delete keyEntry.lastError;
406
+ }
407
+
408
+ // Save updated provider
409
+ try {
410
+ updateProvider(initialPath, providerId, { apiKeys: provider.apiKeys });
411
+ } catch (updateErr) {
412
+ console.warn('[test-key] Failed to update key health status:', updateErr);
413
+ }
414
+ }
415
+ }
416
+
417
+ return {
418
+ valid: testResult.valid,
419
+ error: testResult.error,
420
+ latencyMs: testResult.valid ? latencyMs : undefined,
421
+ keyLabel,
422
+ };
423
+ } catch (err) {
424
+ return { valid: false, error: (err as Error).message };
425
+ }
426
+ });
427
+ return true;
428
+ }
429
+
430
+ // GET /api/litellm-api/providers/:id/health-status - Get health status for all keys
431
+ const providerHealthStatusMatch = pathname.match(/^\/api\/litellm-api\/providers\/([^/]+)\/health-status$/);
432
+ if (providerHealthStatusMatch && req.method === 'GET') {
433
+ const providerId = providerHealthStatusMatch[1];
434
+
435
+ try {
436
+ const provider = getProvider(initialPath, providerId);
437
+
438
+ if (!provider) {
439
+ res.writeHead(404, { 'Content-Type': 'application/json' });
440
+ res.end(JSON.stringify({ error: 'Provider not found' }));
441
+ return true;
442
+ }
443
+
444
+ // Import health check service to get runtime state
445
+ const { getHealthCheckService } = await import('../services/health-check-service.js');
446
+ const healthService = getHealthCheckService();
447
+ const healthStatus = healthService.getProviderHealthStatus(providerId);
448
+
449
+ // Merge persisted key data with runtime health status
450
+ const keys = (provider.apiKeys || []).map(key => {
451
+ const runtimeStatus = healthStatus.find(s => s.keyId === key.id);
452
+ return {
453
+ keyId: key.id,
454
+ label: key.label || key.id,
455
+ status: runtimeStatus?.status || key.healthStatus || 'unknown',
456
+ lastCheck: runtimeStatus?.lastCheck || key.lastHealthCheck,
457
+ lastLatencyMs: key.lastLatencyMs,
458
+ consecutiveFailures: runtimeStatus?.consecutiveFailures || 0,
459
+ inCooldown: runtimeStatus?.inCooldown || false,
460
+ lastError: runtimeStatus?.lastError || key.lastError,
461
+ };
462
+ });
463
+
464
+ res.writeHead(200, { 'Content-Type': 'application/json' });
465
+ res.end(JSON.stringify({
466
+ providerId,
467
+ providerName: provider.name,
468
+ keys,
469
+ }));
470
+ } catch (err) {
471
+ res.writeHead(500, { 'Content-Type': 'application/json' });
472
+ res.end(JSON.stringify({ error: (err as Error).message }));
473
+ }
474
+ return true;
475
+ }
476
+
477
+ // POST /api/litellm-api/providers/:id/health-check-now - Trigger immediate health check
478
+ const providerHealthCheckNowMatch = pathname.match(/^\/api\/litellm-api\/providers\/([^/]+)\/health-check-now$/);
479
+ if (providerHealthCheckNowMatch && req.method === 'POST') {
480
+ const providerId = providerHealthCheckNowMatch[1];
481
+
482
+ try {
483
+ const provider = getProvider(initialPath, providerId);
484
+
485
+ if (!provider) {
486
+ res.writeHead(404, { 'Content-Type': 'application/json' });
487
+ res.end(JSON.stringify({ error: 'Provider not found' }));
488
+ return true;
489
+ }
490
+
491
+ // Import health check service and trigger check
492
+ const { getHealthCheckService } = await import('../services/health-check-service.js');
493
+ const healthService = getHealthCheckService();
494
+
495
+ // Trigger immediate check (async, but we wait for completion)
496
+ await healthService.checkProviderNow(providerId);
497
+
498
+ // Get updated status
499
+ const healthStatus = healthService.getProviderHealthStatus(providerId);
500
+
501
+ // Reload provider to get updated persisted data
502
+ const updatedProvider = getProvider(initialPath, providerId);
503
+ const keys = (updatedProvider?.apiKeys || []).map(key => {
504
+ const runtimeStatus = healthStatus.find(s => s.keyId === key.id);
505
+ return {
506
+ keyId: key.id,
507
+ label: key.label || key.id,
508
+ status: runtimeStatus?.status || key.healthStatus || 'unknown',
509
+ lastCheck: runtimeStatus?.lastCheck || key.lastHealthCheck,
510
+ lastLatencyMs: key.lastLatencyMs,
511
+ consecutiveFailures: runtimeStatus?.consecutiveFailures || 0,
512
+ inCooldown: runtimeStatus?.inCooldown || false,
513
+ lastError: runtimeStatus?.lastError || key.lastError,
514
+ };
515
+ });
516
+
517
+ broadcastToClients({
518
+ type: 'PROVIDER_HEALTH_CHECKED',
519
+ payload: { providerId, keys, timestamp: new Date().toISOString() }
520
+ });
521
+
522
+ res.writeHead(200, { 'Content-Type': 'application/json' });
523
+ res.end(JSON.stringify({
524
+ success: true,
525
+ providerId,
526
+ providerName: updatedProvider?.name,
527
+ keys,
528
+ checkedAt: new Date().toISOString(),
529
+ }));
530
+ } catch (err) {
531
+ res.writeHead(500, { 'Content-Type': 'application/json' });
532
+ res.end(JSON.stringify({ success: false, error: (err as Error).message }));
533
+ }
534
+ return true;
535
+ }
536
+
277
537
  // ===========================
278
538
  // Endpoint Management Routes
279
539
  // ===========================
@@ -397,7 +657,7 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
397
657
  // GET /api/litellm-api/models/:providerType - Get available models for provider type
398
658
  const modelsMatch = pathname.match(/^\/api\/litellm-api\/models\/([^/]+)$/);
399
659
  if (modelsMatch && req.method === 'GET') {
400
- const providerType = modelsMatch[1] as ProviderType;
660
+ const providerType = modelsMatch[1];
401
661
 
402
662
  try {
403
663
  const models = PROVIDER_MODELS[providerType];
@@ -576,7 +836,7 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
576
836
  return true;
577
837
  }
578
838
 
579
- // Async check - use pip show for more reliable detection
839
+ // Async check - use CodexLens venv Python for reliable detection
580
840
  try {
581
841
  const { exec } = await import('child_process');
582
842
  const { promisify } = await import('util');
@@ -584,43 +844,29 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
584
844
 
585
845
  let result: { installed: boolean; version?: string; error?: string } = { installed: false };
586
846
 
587
- // Method 1: Try pip show ccw-litellm (most reliable)
588
- try {
589
- const { stdout } = await execAsync('pip show ccw-litellm', {
590
- timeout: 10000,
591
- windowsHide: true,
592
- shell: true,
593
- });
594
- // Parse version from pip show output
595
- const versionMatch = stdout.match(/Version:\s*(.+)/i);
596
- if (versionMatch) {
597
- result = { installed: true, version: versionMatch[1].trim() };
598
- console.log(`[ccw-litellm status] Found via pip show: ${result.version}`);
599
- }
600
- } catch (pipErr) {
601
- console.log('[ccw-litellm status] pip show failed, trying python import...');
602
-
603
- // Method 2: Fallback to Python import
604
- const pythonExecutables = ['python', 'python3', 'py'];
605
- for (const pythonExe of pythonExecutables) {
606
- try {
607
- // Use simpler Python code without complex quotes
608
- const { stdout } = await execAsync(`${pythonExe} -c "import ccw_litellm; print(ccw_litellm.__version__)"`, {
609
- timeout: 5000,
610
- windowsHide: true,
611
- shell: true,
612
- });
613
- const version = stdout.trim();
614
- if (version) {
615
- result = { installed: true, version };
616
- console.log(`[ccw-litellm status] Found with ${pythonExe}: ${version}`);
617
- break;
618
- }
619
- } catch (err) {
620
- result.error = (err as Error).message;
621
- console.log(`[ccw-litellm status] ${pythonExe} failed:`, result.error.substring(0, 100));
847
+ // Check ONLY in CodexLens venv (where UV installs packages)
848
+ // Do NOT fallback to system pip - we want isolated venv dependencies
849
+ const uv = createCodexLensUvManager();
850
+ const venvPython = uv.getVenvPython();
851
+
852
+ if (uv.isVenvValid()) {
853
+ try {
854
+ const { stdout } = await execAsync(`"${venvPython}" -c "import ccw_litellm; print(ccw_litellm.__version__)"`, {
855
+ timeout: 10000,
856
+ windowsHide: true,
857
+ });
858
+ const version = stdout.trim();
859
+ if (version) {
860
+ result = { installed: true, version };
861
+ console.log(`[ccw-litellm status] Found in CodexLens venv: ${version}`);
622
862
  }
863
+ } catch (venvErr) {
864
+ console.log('[ccw-litellm status] Not found in CodexLens venv');
865
+ result = { installed: false };
623
866
  }
867
+ } else {
868
+ console.log('[ccw-litellm status] CodexLens venv not valid');
869
+ result = { installed: false };
624
870
  }
625
871
 
626
872
  // Update cache
@@ -687,11 +933,12 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
687
933
  if (pathname === '/api/litellm-api/codexlens/rotation/endpoints' && req.method === 'GET') {
688
934
  try {
689
935
  const endpoints = generateRotationEndpoints(initialPath);
936
+ const sanitizedEndpoints = endpoints.map(sanitizeRotationEndpointForResponse);
690
937
 
691
938
  res.writeHead(200, { 'Content-Type': 'application/json' });
692
939
  res.end(JSON.stringify({
693
- endpoints,
694
- count: endpoints.length,
940
+ endpoints: sanitizedEndpoints,
941
+ count: sanitizedEndpoints.length,
695
942
  }));
696
943
  } catch (err) {
697
944
  res.writeHead(500, { 'Content-Type': 'application/json' });
@@ -789,6 +1036,46 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
789
1036
  return true;
790
1037
  }
791
1038
 
1039
+ // GET /api/litellm-api/reranker-pool - Get available reranker models from all providers
1040
+ if (pathname === '/api/litellm-api/reranker-pool' && req.method === 'GET') {
1041
+ try {
1042
+ // Get list of all available reranker models from all providers
1043
+ const config = loadLiteLLMApiConfig(initialPath);
1044
+ const availableModels: Array<{ modelId: string; modelName: string; providers: string[] }> = [];
1045
+ const modelMap = new Map<string, { modelId: string; modelName: string; providers: string[] }>();
1046
+
1047
+ for (const provider of config.providers) {
1048
+ if (!provider.enabled || !provider.rerankerModels) continue;
1049
+
1050
+ for (const model of provider.rerankerModels) {
1051
+ if (!model.enabled) continue;
1052
+
1053
+ const key = model.id;
1054
+ if (modelMap.has(key)) {
1055
+ modelMap.get(key)!.providers.push(provider.name);
1056
+ } else {
1057
+ modelMap.set(key, {
1058
+ modelId: model.id,
1059
+ modelName: model.name,
1060
+ providers: [provider.name],
1061
+ });
1062
+ }
1063
+ }
1064
+ }
1065
+
1066
+ availableModels.push(...Array.from(modelMap.values()));
1067
+
1068
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1069
+ res.end(JSON.stringify({
1070
+ availableModels,
1071
+ }));
1072
+ } catch (err) {
1073
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1074
+ res.end(JSON.stringify({ error: (err as Error).message }));
1075
+ }
1076
+ return true;
1077
+ }
1078
+
792
1079
  // GET /api/litellm-api/embedding-pool/discover/:model - Preview auto-discovery results
793
1080
  const discoverMatch = pathname.match(/^\/api\/litellm-api\/embedding-pool\/discover\/([^/]+)$/);
794
1081
  if (discoverMatch && req.method === 'GET') {
@@ -810,6 +1097,186 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
810
1097
  return true;
811
1098
  }
812
1099
 
1100
+ // ========== Multi-Model Pool Management ==========
1101
+
1102
+ // GET /api/litellm-api/model-pools - Get all model pool configurations
1103
+ if (pathname === '/api/litellm-api/model-pools' && req.method === 'GET') {
1104
+ try {
1105
+ const pools = getModelPools(initialPath);
1106
+
1107
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1108
+ res.end(JSON.stringify({ pools }));
1109
+ } catch (err) {
1110
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1111
+ res.end(JSON.stringify({ error: (err as Error).message }));
1112
+ }
1113
+ return true;
1114
+ }
1115
+
1116
+ // GET /api/litellm-api/model-pools/:id - Get specific pool configuration
1117
+ const poolGetMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/([^/]+)$/);
1118
+ if (poolGetMatch && req.method === 'GET') {
1119
+ const poolId = decodeURIComponent(poolGetMatch[1]);
1120
+
1121
+ try {
1122
+ const pool = getModelPool(initialPath, poolId);
1123
+
1124
+ if (!pool) {
1125
+ res.writeHead(404, { 'Content-Type': 'application/json' });
1126
+ res.end(JSON.stringify({ error: 'Pool not found' }));
1127
+ return true;
1128
+ }
1129
+
1130
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1131
+ res.end(JSON.stringify({ pool }));
1132
+ } catch (err) {
1133
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1134
+ res.end(JSON.stringify({ error: (err as Error).message }));
1135
+ }
1136
+ return true;
1137
+ }
1138
+
1139
+ // POST /api/litellm-api/model-pools - Create new model pool
1140
+ if (pathname === '/api/litellm-api/model-pools' && req.method === 'POST') {
1141
+ handlePostRequest(req, res, async (body: unknown) => {
1142
+ // Validate input using zod schema
1143
+ const validationResult = ModelPoolConfigSchema.safeParse(body);
1144
+ if (!validationResult.success) {
1145
+ return {
1146
+ error: 'Invalid request body',
1147
+ details: validationResult.error.issues.map(e => ({
1148
+ field: String(e.path.join('.')),
1149
+ message: e.message
1150
+ })),
1151
+ status: 400
1152
+ };
1153
+ }
1154
+
1155
+ try {
1156
+ const poolConfig = validationResult.data;
1157
+ const result = addModelPool(initialPath, poolConfig);
1158
+
1159
+ broadcastToClients({
1160
+ type: 'MODEL_POOL_CREATED',
1161
+ payload: { poolId: result.poolId, timestamp: new Date().toISOString() }
1162
+ });
1163
+
1164
+ return { success: true, ...result };
1165
+ } catch (err) {
1166
+ return { error: (err as Error).message, status: 500 };
1167
+ }
1168
+ });
1169
+ return true;
1170
+ }
1171
+
1172
+ // PUT /api/litellm-api/model-pools/:id - Update model pool
1173
+ const poolPutMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/([^/]+)$/);
1174
+ if (poolPutMatch && req.method === 'PUT') {
1175
+ const poolId = decodeURIComponent(poolPutMatch[1]);
1176
+
1177
+ handlePostRequest(req, res, async (body: unknown) => {
1178
+ // Validate input using partial schema (all fields optional for updates)
1179
+ const validationResult = ModelPoolConfigUpdateSchema.safeParse(body);
1180
+ if (!validationResult.success) {
1181
+ return {
1182
+ error: 'Invalid request body',
1183
+ details: validationResult.error.issues.map(e => ({
1184
+ field: String(e.path.join('.')),
1185
+ message: e.message
1186
+ })),
1187
+ status: 400
1188
+ };
1189
+ }
1190
+
1191
+ try {
1192
+ const updates = validationResult.data;
1193
+ const result = updateModelPool(initialPath, poolId, updates);
1194
+
1195
+ if (!result.success) {
1196
+ return { error: 'Pool not found', status: 404 };
1197
+ }
1198
+
1199
+ broadcastToClients({
1200
+ type: 'MODEL_POOL_UPDATED',
1201
+ payload: { poolId, syncResult: result.syncResult, timestamp: new Date().toISOString() }
1202
+ });
1203
+
1204
+ return result;
1205
+ } catch (err) {
1206
+ return { error: (err as Error).message, status: 500 };
1207
+ }
1208
+ });
1209
+ return true;
1210
+ }
1211
+
1212
+ // DELETE /api/litellm-api/model-pools/:id - Delete model pool
1213
+ const poolDeleteMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/([^/]+)$/);
1214
+ if (poolDeleteMatch && req.method === 'DELETE') {
1215
+ const poolId = decodeURIComponent(poolDeleteMatch[1]);
1216
+
1217
+ try {
1218
+ const result = deleteModelPool(initialPath, poolId);
1219
+
1220
+ if (!result.success) {
1221
+ res.writeHead(404, { 'Content-Type': 'application/json' });
1222
+ res.end(JSON.stringify({ error: 'Pool not found' }));
1223
+ return true;
1224
+ }
1225
+
1226
+ broadcastToClients({
1227
+ type: 'MODEL_POOL_DELETED',
1228
+ payload: { poolId, syncResult: result.syncResult, timestamp: new Date().toISOString() }
1229
+ });
1230
+
1231
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1232
+ res.end(JSON.stringify(result));
1233
+ } catch (err) {
1234
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1235
+ res.end(JSON.stringify({ error: (err as Error).message }));
1236
+ }
1237
+ return true;
1238
+ }
1239
+
1240
+ // GET /api/litellm-api/model-pools/available-models/:modelType - Get available models for type
1241
+ const availableModelsMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/available-models\/([^/]+)$/);
1242
+ if (availableModelsMatch && req.method === 'GET') {
1243
+ const modelType = decodeURIComponent(availableModelsMatch[1]) as import('../../types/litellm-api-config.js').ModelPoolType;
1244
+
1245
+ try {
1246
+ const availableModels = getAvailableModelsForType(initialPath, modelType);
1247
+
1248
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1249
+ res.end(JSON.stringify({ availableModels, modelType }));
1250
+ } catch (err) {
1251
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1252
+ res.end(JSON.stringify({ error: (err as Error).message }));
1253
+ }
1254
+ return true;
1255
+ }
1256
+
1257
+ // GET /api/litellm-api/model-pools/discover/:modelType/:model - Discover providers for model
1258
+ const discoverPoolMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/discover\/([^/]+)\/([^/]+)$/);
1259
+ if (discoverPoolMatch && req.method === 'GET') {
1260
+ const modelType = decodeURIComponent(discoverPoolMatch[1]);
1261
+ const targetModel = decodeURIComponent(discoverPoolMatch[2]);
1262
+
1263
+ try {
1264
+ const discovered = discoverProvidersForModel(initialPath, targetModel);
1265
+
1266
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1267
+ res.end(JSON.stringify({
1268
+ modelType,
1269
+ targetModel,
1270
+ discovered,
1271
+ count: discovered.length,
1272
+ }));
1273
+ } catch (err) {
1274
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1275
+ res.end(JSON.stringify({ error: (err as Error).message }));
1276
+ }
1277
+ return true;
1278
+ }
1279
+
813
1280
  // POST /api/litellm-api/ccw-litellm/install - Install ccw-litellm package
814
1281
  if (pathname === '/api/litellm-api/ccw-litellm/install' && req.method === 'POST') {
815
1282
  handlePostRequest(req, res, async () => {
@@ -835,6 +1302,22 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
835
1302
  }
836
1303
  }
837
1304
 
1305
+ // Priority: Use UV if available
1306
+ if (await isUvAvailable()) {
1307
+ const uvResult = await installCcwLitellmWithUv(packagePath || null);
1308
+ if (uvResult.success) {
1309
+ // Broadcast installation event
1310
+ broadcastToClients({
1311
+ type: 'CCW_LITELLM_INSTALLED',
1312
+ payload: { timestamp: new Date().toISOString(), method: 'uv' }
1313
+ });
1314
+ return { ...uvResult, path: packagePath || undefined };
1315
+ }
1316
+ // UV install failed, fall through to pip fallback
1317
+ console.log('[ccw-litellm install] UV install failed, falling back to pip:', uvResult.error);
1318
+ }
1319
+
1320
+ // Fallback: Use pip for installation
838
1321
  // Use shared Python detection for consistent cross-platform behavior
839
1322
  const pythonCmd = getSystemPython();
840
1323
 
@@ -850,6 +1333,10 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
850
1333
  if (code === 0) {
851
1334
  // Clear status cache after successful installation
852
1335
  clearCcwLitellmStatusCache();
1336
+ broadcastToClients({
1337
+ type: 'CCW_LITELLM_INSTALLED',
1338
+ payload: { timestamp: new Date().toISOString(), method: 'pip' }
1339
+ });
853
1340
  resolve({ success: true, message: 'ccw-litellm installed from PyPI' });
854
1341
  } else {
855
1342
  resolve({ success: false, error: error || 'Installation failed' });
@@ -874,7 +1361,7 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
874
1361
  // Broadcast installation event
875
1362
  broadcastToClients({
876
1363
  type: 'CCW_LITELLM_INSTALLED',
877
- payload: { timestamp: new Date().toISOString() }
1364
+ payload: { timestamp: new Date().toISOString(), method: 'pip' }
878
1365
  });
879
1366
  resolve({ success: true, message: 'ccw-litellm installed successfully', path: packagePath });
880
1367
  } else {
@@ -894,9 +1381,28 @@ export async function handleLiteLLMApiRoutes(ctx: RouteContext): Promise<boolean
894
1381
  if (pathname === '/api/litellm-api/ccw-litellm/uninstall' && req.method === 'POST') {
895
1382
  handlePostRequest(req, res, async () => {
896
1383
  try {
897
- const { spawn } = await import('child_process');
1384
+ // Priority 1: Use UV to uninstall from CodexLens venv
1385
+ if (await isUvAvailable()) {
1386
+ const uv = createCodexLensUvManager();
1387
+ if (uv.isVenvValid()) {
1388
+ console.log('[ccw-litellm uninstall] Using UV to uninstall from CodexLens venv...');
1389
+ const uvResult = await uv.uninstall(['ccw-litellm']);
1390
+ clearCcwLitellmStatusCache();
898
1391
 
899
- // Use shared Python detection for consistent cross-platform behavior
1392
+ if (uvResult.success) {
1393
+ broadcastToClients({
1394
+ type: 'CCW_LITELLM_UNINSTALLED',
1395
+ payload: { timestamp: new Date().toISOString() }
1396
+ });
1397
+ return { success: true, message: 'ccw-litellm uninstalled successfully via UV' };
1398
+ }
1399
+ console.log('[ccw-litellm uninstall] UV uninstall failed, falling back to pip:', uvResult.error);
1400
+ }
1401
+ }
1402
+
1403
+ // Priority 2: Fallback to system pip uninstall
1404
+ console.log('[ccw-litellm uninstall] Using pip fallback...');
1405
+ const { spawn } = await import('child_process');
900
1406
  const pythonCmd = getSystemPython();
901
1407
 
902
1408
  return new Promise((resolve) => {