claude-code-workflow 6.3.17 → 6.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (823) hide show
  1. package/.claude/CLAUDE.md +8 -5
  2. package/.claude/agents/action-planning-agent.md +26 -2
  3. package/.claude/agents/code-developer.md +132 -43
  4. package/.claude/agents/debug-explore-agent.md +434 -0
  5. package/.claude/agents/test-fix-agent.md +14 -0
  6. package/.claude/commands/issue/discover.md +41 -0
  7. package/.claude/commands/issue/execute.md +200 -19
  8. package/.claude/commands/issue/new.md +1 -1
  9. package/.claude/commands/issue/plan.md +6 -1
  10. package/.claude/commands/issue/queue.md +94 -39
  11. package/.claude/commands/memory/swagger-docs.md +773 -0
  12. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  13. package/.claude/commands/workflow/execute.md +54 -34
  14. package/.claude/commands/workflow/lite-execute.md +48 -164
  15. package/.claude/commands/workflow/lite-fix.md +4 -4
  16. package/.claude/commands/workflow/lite-plan.md +5 -5
  17. package/.claude/commands/workflow/plan.md +27 -27
  18. package/.claude/commands/workflow/review.md +42 -17
  19. package/.claude/commands/workflow/tdd-plan.md +25 -25
  20. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  21. package/.claude/commands/workflow/test-gen.md +14 -14
  22. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  23. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  24. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  25. package/.claude/skills/ccw/SKILL.md +462 -0
  26. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  27. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  28. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  29. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  30. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  31. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  32. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  33. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  34. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  35. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  36. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  37. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  38. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  39. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  40. package/.claude/skills/ccw-help/SKILL.md +177 -0
  41. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  42. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  43. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  45. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  46. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  47. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  48. package/.claude/skills/code-reviewer/README.md +340 -0
  49. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  50. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  51. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  52. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  53. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  54. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  55. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  56. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  57. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  58. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  59. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  60. package/.claude/skills/skill-generator/SKILL.md +187 -0
  61. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  62. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  63. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  64. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  65. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  66. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  67. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  68. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  69. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  70. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  72. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  73. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  74. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  75. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  76. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  77. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  78. package/.claude/workflows/chinese-response.md +15 -28
  79. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  80. package/.claude/workflows/cli-tools-usage.md +221 -177
  81. package/.claude/workflows/windows-platform.md +13 -10
  82. package/.codex/prompts/issue-execute.md +305 -82
  83. package/.codex/prompts/issue-plan.md +46 -1
  84. package/.codex/prompts/issue-queue.md +67 -3
  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 +505 -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 +201 -29
  277. package/ccw/dist/core/server.js.map +1 -1
  278. package/ccw/dist/core/services/api-key-tester.d.ts +31 -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 +106 -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 +82 -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 +271 -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 +566 -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 +651 -468
  438. package/ccw/src/core/services/api-key-tester.ts +137 -0
  439. package/ccw/src/core/services/health-check-service.ts +340 -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 +4438 -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 +6091 -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 +767 -14
  554. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  555. package/codex-lens/src/codexlens/config.py +321 -12
  556. package/codex-lens/src/codexlens/entities.py +4 -1
  557. package/codex-lens/src/codexlens/env_config.py +298 -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 +1642 -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 +347 -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__/embedder.cpython-310.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  624. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  625. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  626. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  627. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  628. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  629. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  630. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  650. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  651. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  652. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  653. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  654. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  655. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  656. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  657. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  658. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  659. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  660. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  661. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  662. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  681. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  682. package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
  683. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  684. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  691. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  692. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  693. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  694. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  695. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  696. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  697. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  698. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  699. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  700. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  701. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  702. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  703. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  704. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  705. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  706. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  707. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  708. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  709. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  710. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  717. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  718. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  719. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  720. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  721. package/package.json +4 -1
  722. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  723. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  724. package/.claude/skills/command-guide/SKILL.md +0 -388
  725. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  726. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  727. package/.claude/skills/command-guide/guides/examples.md +0 -537
  728. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  729. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  730. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  731. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  732. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  733. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  734. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  735. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  736. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  737. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  738. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  739. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  740. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  741. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  742. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  743. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  744. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  745. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  746. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  747. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  748. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  749. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  750. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  751. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  752. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  753. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  754. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  755. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  756. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  757. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  758. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  759. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  760. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  761. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  762. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  763. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  764. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  765. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  766. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  767. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  768. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  769. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  770. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  771. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  772. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  773. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  774. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  775. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  776. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  779. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  780. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  781. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  782. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  783. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  784. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  785. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  786. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  787. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  788. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  789. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  790. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  791. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  792. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  793. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  794. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  795. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  796. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  797. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  798. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  799. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  800. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  801. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  802. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  803. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  804. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  805. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  806. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  807. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  808. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  809. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  810. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  811. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  812. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  813. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  814. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  815. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  816. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  817. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  818. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  819. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  820. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  821. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  822. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  823. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -1,14 +1,44 @@
1
+ /**
2
+ * LiteLLM API Routes Module
3
+ * Handles LiteLLM provider management, endpoint configuration, and cache management
4
+ */
1
5
  import { fileURLToPath } from 'url';
2
6
  import { dirname, join as pathJoin } from 'path';
7
+ import { z } from 'zod';
3
8
  import { getSystemPython } from '../../utils/python-utils.js';
9
+ import { isUvAvailable, createCodexLensUvManager } from '../../utils/uv-manager.js';
10
+ import { ensureLiteLLMEmbedderReady } from '../../tools/codex-lens.js';
11
+ // ========== Input Validation Schemas ==========
12
+ /**
13
+ * Validation schema for ModelPoolConfig
14
+ * Used to validate incoming API requests for model pool operations
15
+ */
16
+ const ModelPoolConfigSchema = z.object({
17
+ modelType: z.enum(['embedding', 'llm', 'reranker']),
18
+ enabled: z.boolean(),
19
+ targetModel: z.string().min(1, 'Target model is required'),
20
+ strategy: z.enum(['round_robin', 'latency_aware', 'weighted_random']),
21
+ autoDiscover: z.boolean(),
22
+ excludedProviderIds: z.array(z.string()).optional().default([]),
23
+ defaultCooldown: z.number().int().min(0).default(60),
24
+ defaultMaxConcurrentPerKey: z.number().int().min(1).default(4),
25
+ name: z.string().optional(),
26
+ description: z.string().optional(),
27
+ });
28
+ /**
29
+ * Partial schema for updating ModelPoolConfig
30
+ * All fields are optional for PATCH-like updates
31
+ */
32
+ const ModelPoolConfigUpdateSchema = ModelPoolConfigSchema.partial();
4
33
  // Get current module path for package-relative lookups
5
34
  const __filename = fileURLToPath(import.meta.url);
6
35
  const __dirname = dirname(__filename);
7
36
  // Package root: routes -> core -> src -> ccw -> package root
8
37
  const PACKAGE_ROOT = pathJoin(__dirname, '..', '..', '..', '..');
9
- import { getAllProviders, getProvider, addProvider, updateProvider, deleteProvider, getAllEndpoints, getEndpoint, addEndpoint, updateEndpoint, deleteEndpoint, getDefaultEndpoint, setDefaultEndpoint, getGlobalCacheSettings, updateGlobalCacheSettings, loadLiteLLMApiConfig, saveLiteLLMYamlConfig, generateLiteLLMYamlConfig, getCodexLensEmbeddingRotation, updateCodexLensEmbeddingRotation, getEmbeddingProvidersForRotation, generateRotationEndpoints, syncCodexLensConfig, getEmbeddingPoolConfig, updateEmbeddingPoolConfig, discoverProvidersForModel, } from '../../config/litellm-api-config-manager.js';
38
+ import { getAllProviders, getProvider, addProvider, updateProvider, deleteProvider, getAllEndpoints, getEndpoint, addEndpoint, updateEndpoint, deleteEndpoint, getDefaultEndpoint, setDefaultEndpoint, getGlobalCacheSettings, updateGlobalCacheSettings, loadLiteLLMApiConfig, saveLiteLLMYamlConfig, generateLiteLLMYamlConfig, getCodexLensEmbeddingRotation, updateCodexLensEmbeddingRotation, getEmbeddingProvidersForRotation, generateRotationEndpoints, syncCodexLensConfig, getEmbeddingPoolConfig, updateEmbeddingPoolConfig, discoverProvidersForModel, getModelPools, getModelPool, addModelPool, updateModelPool, deleteModelPool, getAvailableModelsForType, } from '../../config/litellm-api-config-manager.js';
10
39
  import { getContextCacheStore } from '../../tools/context-cache-store.js';
11
40
  import { getLiteLLMClient } from '../../tools/litellm-client.js';
41
+ import { testApiKeyConnection, getDefaultApiBase } from '../services/api-key-tester.js';
12
42
  // Cache for ccw-litellm status check
13
43
  let ccwLitellmStatusCache = {
14
44
  data: null,
@@ -20,6 +50,39 @@ export function clearCcwLitellmStatusCache() {
20
50
  ccwLitellmStatusCache.data = null;
21
51
  ccwLitellmStatusCache.timestamp = 0;
22
52
  }
53
+ /**
54
+ * Install ccw-litellm using UV package manager
55
+ * Delegates to ensureLiteLLMEmbedderReady for consistent dependency handling
56
+ * This ensures ccw-litellm installation doesn't break fastembed's onnxruntime dependencies
57
+ * @param _packagePath - Ignored, ensureLiteLLMEmbedderReady handles path discovery
58
+ * @returns Installation result
59
+ */
60
+ async function installCcwLitellmWithUv(_packagePath) {
61
+ // Delegate to the robust installation logic in codex-lens.ts
62
+ // This ensures consistent dependency handling within the shared venv,
63
+ // preventing onnxruntime conflicts that would break fastembed
64
+ const result = await ensureLiteLLMEmbedderReady();
65
+ if (result.success) {
66
+ clearCcwLitellmStatusCache();
67
+ }
68
+ return result;
69
+ }
70
+ function sanitizeProviderForResponse(provider) {
71
+ if (!provider)
72
+ return provider;
73
+ return {
74
+ ...provider,
75
+ apiKey: '***',
76
+ apiKeys: Array.isArray(provider.apiKeys)
77
+ ? provider.apiKeys.map((entry) => ({ ...entry, key: '***' }))
78
+ : provider.apiKeys,
79
+ };
80
+ }
81
+ function sanitizeRotationEndpointForResponse(endpoint) {
82
+ if (!endpoint)
83
+ return endpoint;
84
+ return { ...endpoint, api_key: '***' };
85
+ }
23
86
  const PROVIDER_MODELS = {
24
87
  openai: [
25
88
  { id: 'gpt-4-turbo', name: 'GPT-4 Turbo', provider: 'openai', description: '128K context' },
@@ -62,7 +125,7 @@ export async function handleLiteLLMApiRoutes(ctx) {
62
125
  // GET /api/litellm-api/providers - List all providers
63
126
  if (pathname === '/api/litellm-api/providers' && req.method === 'GET') {
64
127
  try {
65
- const providers = getAllProviders(initialPath);
128
+ const providers = getAllProviders(initialPath).map(sanitizeProviderForResponse);
66
129
  res.writeHead(200, { 'Content-Type': 'application/json' });
67
130
  res.end(JSON.stringify({ providers, count: providers.length }));
68
131
  }
@@ -81,11 +144,12 @@ export async function handleLiteLLMApiRoutes(ctx) {
81
144
  }
82
145
  try {
83
146
  const provider = addProvider(initialPath, providerData);
147
+ const sanitizedProvider = sanitizeProviderForResponse(provider);
84
148
  broadcastToClients({
85
149
  type: 'LITELLM_PROVIDER_CREATED',
86
- payload: { provider, timestamp: new Date().toISOString() }
150
+ payload: { provider: sanitizedProvider, timestamp: new Date().toISOString() }
87
151
  });
88
- return { success: true, provider };
152
+ return { success: true, provider: sanitizedProvider };
89
153
  }
90
154
  catch (err) {
91
155
  return { error: err.message, status: 500 };
@@ -105,7 +169,7 @@ export async function handleLiteLLMApiRoutes(ctx) {
105
169
  return true;
106
170
  }
107
171
  res.writeHead(200, { 'Content-Type': 'application/json' });
108
- res.end(JSON.stringify(provider));
172
+ res.end(JSON.stringify(sanitizeProviderForResponse(provider)));
109
173
  }
110
174
  catch (err) {
111
175
  res.writeHead(500, { 'Content-Type': 'application/json' });
@@ -121,11 +185,12 @@ export async function handleLiteLLMApiRoutes(ctx) {
121
185
  const updates = body;
122
186
  try {
123
187
  const provider = updateProvider(initialPath, providerId, updates);
188
+ const sanitizedProvider = sanitizeProviderForResponse(provider);
124
189
  broadcastToClients({
125
190
  type: 'LITELLM_PROVIDER_UPDATED',
126
- payload: { provider, timestamp: new Date().toISOString() }
191
+ payload: { provider: sanitizedProvider, timestamp: new Date().toISOString() }
127
192
  });
128
- return { success: true, provider };
193
+ return { success: true, provider: sanitizedProvider };
129
194
  }
130
195
  catch (err) {
131
196
  return { error: err.message, status: 404 };
@@ -185,6 +250,177 @@ export async function handleLiteLLMApiRoutes(ctx) {
185
250
  }
186
251
  return true;
187
252
  }
253
+ // POST /api/litellm-api/providers/:id/test-key - Test specific API key
254
+ const providerTestKeyMatch = pathname.match(/^\/api\/litellm-api\/providers\/([^/]+)\/test-key$/);
255
+ if (providerTestKeyMatch && req.method === 'POST') {
256
+ const providerId = providerTestKeyMatch[1];
257
+ handlePostRequest(req, res, async (body) => {
258
+ const { keyId } = body;
259
+ if (!keyId) {
260
+ return { valid: false, error: 'keyId is required', status: 400 };
261
+ }
262
+ try {
263
+ const provider = getProvider(initialPath, providerId);
264
+ if (!provider) {
265
+ return { valid: false, error: 'Provider not found', status: 404 };
266
+ }
267
+ // Find the specific API key
268
+ let apiKeyValue = null;
269
+ let keyLabel = 'Default';
270
+ if (keyId === 'default' && provider.apiKey) {
271
+ // Use the single default apiKey
272
+ apiKeyValue = provider.apiKey;
273
+ }
274
+ else if (provider.apiKeys && provider.apiKeys.length > 0) {
275
+ const keyEntry = provider.apiKeys.find(k => k.id === keyId);
276
+ if (keyEntry) {
277
+ apiKeyValue = keyEntry.key;
278
+ keyLabel = keyEntry.label || keyEntry.id;
279
+ }
280
+ }
281
+ if (!apiKeyValue) {
282
+ return { valid: false, error: 'API key not found' };
283
+ }
284
+ // Resolve environment variables
285
+ const { resolveEnvVar } = await import('../../config/litellm-api-config-manager.js');
286
+ const resolvedKey = resolveEnvVar(apiKeyValue);
287
+ if (!resolvedKey) {
288
+ return { valid: false, error: 'API key is empty or environment variable not set' };
289
+ }
290
+ // Determine API base URL
291
+ const apiBase = provider.apiBase || getDefaultApiBase(provider.type);
292
+ // Test the API key with appropriate endpoint based on provider type
293
+ const startTime = Date.now();
294
+ const testResult = await testApiKeyConnection(provider.type, apiBase, resolvedKey);
295
+ const latencyMs = Date.now() - startTime;
296
+ // Update key health status in provider config
297
+ if (provider.apiKeys && provider.apiKeys.length > 0) {
298
+ const keyEntry = provider.apiKeys.find(k => k.id === keyId);
299
+ if (keyEntry) {
300
+ keyEntry.healthStatus = testResult.valid ? 'healthy' : 'unhealthy';
301
+ keyEntry.lastHealthCheck = new Date().toISOString();
302
+ if (!testResult.valid) {
303
+ keyEntry.lastError = testResult.error;
304
+ }
305
+ else {
306
+ delete keyEntry.lastError;
307
+ }
308
+ // Save updated provider
309
+ try {
310
+ updateProvider(initialPath, providerId, { apiKeys: provider.apiKeys });
311
+ }
312
+ catch (updateErr) {
313
+ console.warn('[test-key] Failed to update key health status:', updateErr);
314
+ }
315
+ }
316
+ }
317
+ return {
318
+ valid: testResult.valid,
319
+ error: testResult.error,
320
+ latencyMs: testResult.valid ? latencyMs : undefined,
321
+ keyLabel,
322
+ };
323
+ }
324
+ catch (err) {
325
+ return { valid: false, error: err.message };
326
+ }
327
+ });
328
+ return true;
329
+ }
330
+ // GET /api/litellm-api/providers/:id/health-status - Get health status for all keys
331
+ const providerHealthStatusMatch = pathname.match(/^\/api\/litellm-api\/providers\/([^/]+)\/health-status$/);
332
+ if (providerHealthStatusMatch && req.method === 'GET') {
333
+ const providerId = providerHealthStatusMatch[1];
334
+ try {
335
+ const provider = getProvider(initialPath, providerId);
336
+ if (!provider) {
337
+ res.writeHead(404, { 'Content-Type': 'application/json' });
338
+ res.end(JSON.stringify({ error: 'Provider not found' }));
339
+ return true;
340
+ }
341
+ // Import health check service to get runtime state
342
+ const { getHealthCheckService } = await import('../services/health-check-service.js');
343
+ const healthService = getHealthCheckService();
344
+ const healthStatus = healthService.getProviderHealthStatus(providerId);
345
+ // Merge persisted key data with runtime health status
346
+ const keys = (provider.apiKeys || []).map(key => {
347
+ const runtimeStatus = healthStatus.find(s => s.keyId === key.id);
348
+ return {
349
+ keyId: key.id,
350
+ label: key.label || key.id,
351
+ status: runtimeStatus?.status || key.healthStatus || 'unknown',
352
+ lastCheck: runtimeStatus?.lastCheck || key.lastHealthCheck,
353
+ lastLatencyMs: key.lastLatencyMs,
354
+ consecutiveFailures: runtimeStatus?.consecutiveFailures || 0,
355
+ inCooldown: runtimeStatus?.inCooldown || false,
356
+ lastError: runtimeStatus?.lastError || key.lastError,
357
+ };
358
+ });
359
+ res.writeHead(200, { 'Content-Type': 'application/json' });
360
+ res.end(JSON.stringify({
361
+ providerId,
362
+ providerName: provider.name,
363
+ keys,
364
+ }));
365
+ }
366
+ catch (err) {
367
+ res.writeHead(500, { 'Content-Type': 'application/json' });
368
+ res.end(JSON.stringify({ error: err.message }));
369
+ }
370
+ return true;
371
+ }
372
+ // POST /api/litellm-api/providers/:id/health-check-now - Trigger immediate health check
373
+ const providerHealthCheckNowMatch = pathname.match(/^\/api\/litellm-api\/providers\/([^/]+)\/health-check-now$/);
374
+ if (providerHealthCheckNowMatch && req.method === 'POST') {
375
+ const providerId = providerHealthCheckNowMatch[1];
376
+ try {
377
+ const provider = getProvider(initialPath, providerId);
378
+ if (!provider) {
379
+ res.writeHead(404, { 'Content-Type': 'application/json' });
380
+ res.end(JSON.stringify({ error: 'Provider not found' }));
381
+ return true;
382
+ }
383
+ // Import health check service and trigger check
384
+ const { getHealthCheckService } = await import('../services/health-check-service.js');
385
+ const healthService = getHealthCheckService();
386
+ // Trigger immediate check (async, but we wait for completion)
387
+ await healthService.checkProviderNow(providerId);
388
+ // Get updated status
389
+ const healthStatus = healthService.getProviderHealthStatus(providerId);
390
+ // Reload provider to get updated persisted data
391
+ const updatedProvider = getProvider(initialPath, providerId);
392
+ const keys = (updatedProvider?.apiKeys || []).map(key => {
393
+ const runtimeStatus = healthStatus.find(s => s.keyId === key.id);
394
+ return {
395
+ keyId: key.id,
396
+ label: key.label || key.id,
397
+ status: runtimeStatus?.status || key.healthStatus || 'unknown',
398
+ lastCheck: runtimeStatus?.lastCheck || key.lastHealthCheck,
399
+ lastLatencyMs: key.lastLatencyMs,
400
+ consecutiveFailures: runtimeStatus?.consecutiveFailures || 0,
401
+ inCooldown: runtimeStatus?.inCooldown || false,
402
+ lastError: runtimeStatus?.lastError || key.lastError,
403
+ };
404
+ });
405
+ broadcastToClients({
406
+ type: 'PROVIDER_HEALTH_CHECKED',
407
+ payload: { providerId, keys, timestamp: new Date().toISOString() }
408
+ });
409
+ res.writeHead(200, { 'Content-Type': 'application/json' });
410
+ res.end(JSON.stringify({
411
+ success: true,
412
+ providerId,
413
+ providerName: updatedProvider?.name,
414
+ keys,
415
+ checkedAt: new Date().toISOString(),
416
+ }));
417
+ }
418
+ catch (err) {
419
+ res.writeHead(500, { 'Content-Type': 'application/json' });
420
+ res.end(JSON.stringify({ success: false, error: err.message }));
421
+ }
422
+ return true;
423
+ }
188
424
  // ===========================
189
425
  // Endpoint Management Routes
190
426
  // ===========================
@@ -448,50 +684,36 @@ export async function handleLiteLLMApiRoutes(ctx) {
448
684
  res.end(JSON.stringify(ccwLitellmStatusCache.data));
449
685
  return true;
450
686
  }
451
- // Async check - use pip show for more reliable detection
687
+ // Async check - use CodexLens venv Python for reliable detection
452
688
  try {
453
689
  const { exec } = await import('child_process');
454
690
  const { promisify } = await import('util');
455
691
  const execAsync = promisify(exec);
456
692
  let result = { installed: false };
457
- // Method 1: Try pip show ccw-litellm (most reliable)
458
- try {
459
- const { stdout } = await execAsync('pip show ccw-litellm', {
460
- timeout: 10000,
461
- windowsHide: true,
462
- shell: true,
463
- });
464
- // Parse version from pip show output
465
- const versionMatch = stdout.match(/Version:\s*(.+)/i);
466
- if (versionMatch) {
467
- result = { installed: true, version: versionMatch[1].trim() };
468
- console.log(`[ccw-litellm status] Found via pip show: ${result.version}`);
469
- }
470
- }
471
- catch (pipErr) {
472
- console.log('[ccw-litellm status] pip show failed, trying python import...');
473
- // Method 2: Fallback to Python import
474
- const pythonExecutables = ['python', 'python3', 'py'];
475
- for (const pythonExe of pythonExecutables) {
476
- try {
477
- // Use simpler Python code without complex quotes
478
- const { stdout } = await execAsync(`${pythonExe} -c "import ccw_litellm; print(ccw_litellm.__version__)"`, {
479
- timeout: 5000,
480
- windowsHide: true,
481
- shell: true,
482
- });
483
- const version = stdout.trim();
484
- if (version) {
485
- result = { installed: true, version };
486
- console.log(`[ccw-litellm status] Found with ${pythonExe}: ${version}`);
487
- break;
488
- }
489
- }
490
- catch (err) {
491
- result.error = err.message;
492
- console.log(`[ccw-litellm status] ${pythonExe} failed:`, result.error.substring(0, 100));
693
+ // Check ONLY in CodexLens venv (where UV installs packages)
694
+ // Do NOT fallback to system pip - we want isolated venv dependencies
695
+ const uv = createCodexLensUvManager();
696
+ const venvPython = uv.getVenvPython();
697
+ if (uv.isVenvValid()) {
698
+ try {
699
+ const { stdout } = await execAsync(`"${venvPython}" -c "import ccw_litellm; print(ccw_litellm.__version__)"`, {
700
+ timeout: 10000,
701
+ windowsHide: true,
702
+ });
703
+ const version = stdout.trim();
704
+ if (version) {
705
+ result = { installed: true, version };
706
+ console.log(`[ccw-litellm status] Found in CodexLens venv: ${version}`);
493
707
  }
494
708
  }
709
+ catch (venvErr) {
710
+ console.log('[ccw-litellm status] Not found in CodexLens venv');
711
+ result = { installed: false };
712
+ }
713
+ }
714
+ else {
715
+ console.log('[ccw-litellm status] CodexLens venv not valid');
716
+ result = { installed: false };
495
717
  }
496
718
  // Update cache
497
719
  ccwLitellmStatusCache = {
@@ -551,10 +773,11 @@ export async function handleLiteLLMApiRoutes(ctx) {
551
773
  if (pathname === '/api/litellm-api/codexlens/rotation/endpoints' && req.method === 'GET') {
552
774
  try {
553
775
  const endpoints = generateRotationEndpoints(initialPath);
776
+ const sanitizedEndpoints = endpoints.map(sanitizeRotationEndpointForResponse);
554
777
  res.writeHead(200, { 'Content-Type': 'application/json' });
555
778
  res.end(JSON.stringify({
556
- endpoints,
557
- count: endpoints.length,
779
+ endpoints: sanitizedEndpoints,
780
+ count: sanitizedEndpoints.length,
558
781
  }));
559
782
  }
560
783
  catch (err) {
@@ -643,6 +866,44 @@ export async function handleLiteLLMApiRoutes(ctx) {
643
866
  });
644
867
  return true;
645
868
  }
869
+ // GET /api/litellm-api/reranker-pool - Get available reranker models from all providers
870
+ if (pathname === '/api/litellm-api/reranker-pool' && req.method === 'GET') {
871
+ try {
872
+ // Get list of all available reranker models from all providers
873
+ const config = loadLiteLLMApiConfig(initialPath);
874
+ const availableModels = [];
875
+ const modelMap = new Map();
876
+ for (const provider of config.providers) {
877
+ if (!provider.enabled || !provider.rerankerModels)
878
+ continue;
879
+ for (const model of provider.rerankerModels) {
880
+ if (!model.enabled)
881
+ continue;
882
+ const key = model.id;
883
+ if (modelMap.has(key)) {
884
+ modelMap.get(key).providers.push(provider.name);
885
+ }
886
+ else {
887
+ modelMap.set(key, {
888
+ modelId: model.id,
889
+ modelName: model.name,
890
+ providers: [provider.name],
891
+ });
892
+ }
893
+ }
894
+ }
895
+ availableModels.push(...Array.from(modelMap.values()));
896
+ res.writeHead(200, { 'Content-Type': 'application/json' });
897
+ res.end(JSON.stringify({
898
+ availableModels,
899
+ }));
900
+ }
901
+ catch (err) {
902
+ res.writeHead(500, { 'Content-Type': 'application/json' });
903
+ res.end(JSON.stringify({ error: err.message }));
904
+ }
905
+ return true;
906
+ }
646
907
  // GET /api/litellm-api/embedding-pool/discover/:model - Preview auto-discovery results
647
908
  const discoverMatch = pathname.match(/^\/api\/litellm-api\/embedding-pool\/discover\/([^/]+)$/);
648
909
  if (discoverMatch && req.method === 'GET') {
@@ -662,6 +923,165 @@ export async function handleLiteLLMApiRoutes(ctx) {
662
923
  }
663
924
  return true;
664
925
  }
926
+ // ========== Multi-Model Pool Management ==========
927
+ // GET /api/litellm-api/model-pools - Get all model pool configurations
928
+ if (pathname === '/api/litellm-api/model-pools' && req.method === 'GET') {
929
+ try {
930
+ const pools = getModelPools(initialPath);
931
+ res.writeHead(200, { 'Content-Type': 'application/json' });
932
+ res.end(JSON.stringify({ pools }));
933
+ }
934
+ catch (err) {
935
+ res.writeHead(500, { 'Content-Type': 'application/json' });
936
+ res.end(JSON.stringify({ error: err.message }));
937
+ }
938
+ return true;
939
+ }
940
+ // GET /api/litellm-api/model-pools/:id - Get specific pool configuration
941
+ const poolGetMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/([^/]+)$/);
942
+ if (poolGetMatch && req.method === 'GET') {
943
+ const poolId = decodeURIComponent(poolGetMatch[1]);
944
+ try {
945
+ const pool = getModelPool(initialPath, poolId);
946
+ if (!pool) {
947
+ res.writeHead(404, { 'Content-Type': 'application/json' });
948
+ res.end(JSON.stringify({ error: 'Pool not found' }));
949
+ return true;
950
+ }
951
+ res.writeHead(200, { 'Content-Type': 'application/json' });
952
+ res.end(JSON.stringify({ pool }));
953
+ }
954
+ catch (err) {
955
+ res.writeHead(500, { 'Content-Type': 'application/json' });
956
+ res.end(JSON.stringify({ error: err.message }));
957
+ }
958
+ return true;
959
+ }
960
+ // POST /api/litellm-api/model-pools - Create new model pool
961
+ if (pathname === '/api/litellm-api/model-pools' && req.method === 'POST') {
962
+ handlePostRequest(req, res, async (body) => {
963
+ // Validate input using zod schema
964
+ const validationResult = ModelPoolConfigSchema.safeParse(body);
965
+ if (!validationResult.success) {
966
+ return {
967
+ error: 'Invalid request body',
968
+ details: validationResult.error.issues.map(e => ({
969
+ field: String(e.path.join('.')),
970
+ message: e.message
971
+ })),
972
+ status: 400
973
+ };
974
+ }
975
+ try {
976
+ const poolConfig = validationResult.data;
977
+ const result = addModelPool(initialPath, poolConfig);
978
+ broadcastToClients({
979
+ type: 'MODEL_POOL_CREATED',
980
+ payload: { poolId: result.poolId, timestamp: new Date().toISOString() }
981
+ });
982
+ return { success: true, ...result };
983
+ }
984
+ catch (err) {
985
+ return { error: err.message, status: 500 };
986
+ }
987
+ });
988
+ return true;
989
+ }
990
+ // PUT /api/litellm-api/model-pools/:id - Update model pool
991
+ const poolPutMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/([^/]+)$/);
992
+ if (poolPutMatch && req.method === 'PUT') {
993
+ const poolId = decodeURIComponent(poolPutMatch[1]);
994
+ handlePostRequest(req, res, async (body) => {
995
+ // Validate input using partial schema (all fields optional for updates)
996
+ const validationResult = ModelPoolConfigUpdateSchema.safeParse(body);
997
+ if (!validationResult.success) {
998
+ return {
999
+ error: 'Invalid request body',
1000
+ details: validationResult.error.issues.map(e => ({
1001
+ field: String(e.path.join('.')),
1002
+ message: e.message
1003
+ })),
1004
+ status: 400
1005
+ };
1006
+ }
1007
+ try {
1008
+ const updates = validationResult.data;
1009
+ const result = updateModelPool(initialPath, poolId, updates);
1010
+ if (!result.success) {
1011
+ return { error: 'Pool not found', status: 404 };
1012
+ }
1013
+ broadcastToClients({
1014
+ type: 'MODEL_POOL_UPDATED',
1015
+ payload: { poolId, syncResult: result.syncResult, timestamp: new Date().toISOString() }
1016
+ });
1017
+ return result;
1018
+ }
1019
+ catch (err) {
1020
+ return { error: err.message, status: 500 };
1021
+ }
1022
+ });
1023
+ return true;
1024
+ }
1025
+ // DELETE /api/litellm-api/model-pools/:id - Delete model pool
1026
+ const poolDeleteMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/([^/]+)$/);
1027
+ if (poolDeleteMatch && req.method === 'DELETE') {
1028
+ const poolId = decodeURIComponent(poolDeleteMatch[1]);
1029
+ try {
1030
+ const result = deleteModelPool(initialPath, poolId);
1031
+ if (!result.success) {
1032
+ res.writeHead(404, { 'Content-Type': 'application/json' });
1033
+ res.end(JSON.stringify({ error: 'Pool not found' }));
1034
+ return true;
1035
+ }
1036
+ broadcastToClients({
1037
+ type: 'MODEL_POOL_DELETED',
1038
+ payload: { poolId, syncResult: result.syncResult, timestamp: new Date().toISOString() }
1039
+ });
1040
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1041
+ res.end(JSON.stringify(result));
1042
+ }
1043
+ catch (err) {
1044
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1045
+ res.end(JSON.stringify({ error: err.message }));
1046
+ }
1047
+ return true;
1048
+ }
1049
+ // GET /api/litellm-api/model-pools/available-models/:modelType - Get available models for type
1050
+ const availableModelsMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/available-models\/([^/]+)$/);
1051
+ if (availableModelsMatch && req.method === 'GET') {
1052
+ const modelType = decodeURIComponent(availableModelsMatch[1]);
1053
+ try {
1054
+ const availableModels = getAvailableModelsForType(initialPath, modelType);
1055
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1056
+ res.end(JSON.stringify({ availableModels, modelType }));
1057
+ }
1058
+ catch (err) {
1059
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1060
+ res.end(JSON.stringify({ error: err.message }));
1061
+ }
1062
+ return true;
1063
+ }
1064
+ // GET /api/litellm-api/model-pools/discover/:modelType/:model - Discover providers for model
1065
+ const discoverPoolMatch = pathname.match(/^\/api\/litellm-api\/model-pools\/discover\/([^/]+)\/([^/]+)$/);
1066
+ if (discoverPoolMatch && req.method === 'GET') {
1067
+ const modelType = decodeURIComponent(discoverPoolMatch[1]);
1068
+ const targetModel = decodeURIComponent(discoverPoolMatch[2]);
1069
+ try {
1070
+ const discovered = discoverProvidersForModel(initialPath, targetModel);
1071
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1072
+ res.end(JSON.stringify({
1073
+ modelType,
1074
+ targetModel,
1075
+ discovered,
1076
+ count: discovered.length,
1077
+ }));
1078
+ }
1079
+ catch (err) {
1080
+ res.writeHead(500, { 'Content-Type': 'application/json' });
1081
+ res.end(JSON.stringify({ error: err.message }));
1082
+ }
1083
+ return true;
1084
+ }
665
1085
  // POST /api/litellm-api/ccw-litellm/install - Install ccw-litellm package
666
1086
  if (pathname === '/api/litellm-api/ccw-litellm/install' && req.method === 'POST') {
667
1087
  handlePostRequest(req, res, async () => {
@@ -684,6 +1104,21 @@ export async function handleLiteLLMApiRoutes(ctx) {
684
1104
  break;
685
1105
  }
686
1106
  }
1107
+ // Priority: Use UV if available
1108
+ if (await isUvAvailable()) {
1109
+ const uvResult = await installCcwLitellmWithUv(packagePath || null);
1110
+ if (uvResult.success) {
1111
+ // Broadcast installation event
1112
+ broadcastToClients({
1113
+ type: 'CCW_LITELLM_INSTALLED',
1114
+ payload: { timestamp: new Date().toISOString(), method: 'uv' }
1115
+ });
1116
+ return { ...uvResult, path: packagePath || undefined };
1117
+ }
1118
+ // UV install failed, fall through to pip fallback
1119
+ console.log('[ccw-litellm install] UV install failed, falling back to pip:', uvResult.error);
1120
+ }
1121
+ // Fallback: Use pip for installation
687
1122
  // Use shared Python detection for consistent cross-platform behavior
688
1123
  const pythonCmd = getSystemPython();
689
1124
  if (!packagePath) {
@@ -698,6 +1133,10 @@ export async function handleLiteLLMApiRoutes(ctx) {
698
1133
  if (code === 0) {
699
1134
  // Clear status cache after successful installation
700
1135
  clearCcwLitellmStatusCache();
1136
+ broadcastToClients({
1137
+ type: 'CCW_LITELLM_INSTALLED',
1138
+ payload: { timestamp: new Date().toISOString(), method: 'pip' }
1139
+ });
701
1140
  resolve({ success: true, message: 'ccw-litellm installed from PyPI' });
702
1141
  }
703
1142
  else {
@@ -721,7 +1160,7 @@ export async function handleLiteLLMApiRoutes(ctx) {
721
1160
  // Broadcast installation event
722
1161
  broadcastToClients({
723
1162
  type: 'CCW_LITELLM_INSTALLED',
724
- payload: { timestamp: new Date().toISOString() }
1163
+ payload: { timestamp: new Date().toISOString(), method: 'pip' }
725
1164
  });
726
1165
  resolve({ success: true, message: 'ccw-litellm installed successfully', path: packagePath });
727
1166
  }
@@ -742,8 +1181,26 @@ export async function handleLiteLLMApiRoutes(ctx) {
742
1181
  if (pathname === '/api/litellm-api/ccw-litellm/uninstall' && req.method === 'POST') {
743
1182
  handlePostRequest(req, res, async () => {
744
1183
  try {
1184
+ // Priority 1: Use UV to uninstall from CodexLens venv
1185
+ if (await isUvAvailable()) {
1186
+ const uv = createCodexLensUvManager();
1187
+ if (uv.isVenvValid()) {
1188
+ console.log('[ccw-litellm uninstall] Using UV to uninstall from CodexLens venv...');
1189
+ const uvResult = await uv.uninstall(['ccw-litellm']);
1190
+ clearCcwLitellmStatusCache();
1191
+ if (uvResult.success) {
1192
+ broadcastToClients({
1193
+ type: 'CCW_LITELLM_UNINSTALLED',
1194
+ payload: { timestamp: new Date().toISOString() }
1195
+ });
1196
+ return { success: true, message: 'ccw-litellm uninstalled successfully via UV' };
1197
+ }
1198
+ console.log('[ccw-litellm uninstall] UV uninstall failed, falling back to pip:', uvResult.error);
1199
+ }
1200
+ }
1201
+ // Priority 2: Fallback to system pip uninstall
1202
+ console.log('[ccw-litellm uninstall] Using pip fallback...');
745
1203
  const { spawn } = await import('child_process');
746
- // Use shared Python detection for consistent cross-platform behavior
747
1204
  const pythonCmd = getSystemPython();
748
1205
  return new Promise((resolve) => {
749
1206
  const proc = spawn(pythonCmd, ['-m', 'pip', 'uninstall', '-y', 'ccw-litellm'], { shell: true, timeout: 120000 });