claude-code-workflow 6.3.18 → 6.3.20

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