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
@@ -0,0 +1,865 @@
1
+ /**
2
+ * CodexLens semantic search + reranker + SPLADE handlers.
3
+ */
4
+ import { checkSemanticStatus, checkVenvStatus, executeCodexLens, installSemantic, } from '../../../tools/codex-lens.js';
5
+ import { getAvailableModelsForType, getAllProviders } from '../../../config/litellm-api-config-manager.js';
6
+ import { isUvAvailable, createCodexLensUvManager, } from '../../../utils/uv-manager.js';
7
+ import { extractJSON } from './utils.js';
8
+ export async function handleCodexLensSemanticRoutes(ctx) {
9
+ const { pathname, url, req, res, initialPath, handlePostRequest } = ctx;
10
+ // API: CodexLens Semantic Search Status
11
+ if (pathname === '/api/codexlens/semantic/status') {
12
+ const status = await checkSemanticStatus();
13
+ res.writeHead(200, { 'Content-Type': 'application/json' });
14
+ res.end(JSON.stringify(status));
15
+ return true;
16
+ }
17
+ // API: CodexLens Semantic Metadata List
18
+ if (pathname === '/api/codexlens/semantic/metadata') {
19
+ const offset = parseInt(url.searchParams.get('offset') || '0', 10);
20
+ const limit = parseInt(url.searchParams.get('limit') || '50', 10);
21
+ const tool = url.searchParams.get('tool') || '';
22
+ const projectPath = url.searchParams.get('path') || initialPath;
23
+ try {
24
+ const args = [
25
+ 'semantic-list',
26
+ '--path', projectPath,
27
+ '--offset', offset.toString(),
28
+ '--limit', limit.toString(),
29
+ '--json'
30
+ ];
31
+ if (tool) {
32
+ args.push('--tool', tool);
33
+ }
34
+ const result = await executeCodexLens(args, { cwd: projectPath });
35
+ if (result.success) {
36
+ res.writeHead(200, { 'Content-Type': 'application/json' });
37
+ res.end(result.output ?? '');
38
+ }
39
+ else {
40
+ res.writeHead(500, { 'Content-Type': 'application/json' });
41
+ res.end(JSON.stringify({ success: false, error: result.error }));
42
+ }
43
+ }
44
+ catch (err) {
45
+ res.writeHead(500, { 'Content-Type': 'application/json' });
46
+ res.end(JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }));
47
+ }
48
+ return true;
49
+ }
50
+ // API: CodexLens LLM Enhancement (run enhance command)
51
+ if (pathname === '/api/codexlens/enhance' && req.method === 'POST') {
52
+ handlePostRequest(req, res, async (body) => {
53
+ const { path: projectPath, tool = 'gemini', batchSize = 5, timeoutMs = 300000 } = body;
54
+ const targetPath = typeof projectPath === 'string' && projectPath.trim().length > 0 ? projectPath : initialPath;
55
+ const resolvedTool = typeof tool === 'string' && tool.trim().length > 0 ? tool : 'gemini';
56
+ const resolvedBatchSize = typeof batchSize === 'number' ? batchSize : Number(batchSize);
57
+ const resolvedTimeoutMs = typeof timeoutMs === 'number' ? timeoutMs : Number(timeoutMs);
58
+ try {
59
+ const args = ['enhance', targetPath, '--tool', resolvedTool, '--batch-size', String(resolvedBatchSize)];
60
+ const timeout = !Number.isNaN(resolvedTimeoutMs) ? resolvedTimeoutMs + 30000 : 330000;
61
+ const result = await executeCodexLens(args, { cwd: targetPath, timeout });
62
+ if (result.success) {
63
+ try {
64
+ const parsed = extractJSON(result.output ?? '');
65
+ return { success: true, result: parsed };
66
+ }
67
+ catch {
68
+ return { success: true, output: result.output ?? '' };
69
+ }
70
+ }
71
+ else {
72
+ return { success: false, error: result.error, status: 500 };
73
+ }
74
+ }
75
+ catch (err) {
76
+ return { success: false, error: err instanceof Error ? err.message : String(err), status: 500 };
77
+ }
78
+ });
79
+ return true;
80
+ }
81
+ // API: CodexLens Search (FTS5 text search with mode support)
82
+ if (pathname === '/api/codexlens/search') {
83
+ const query = url.searchParams.get('query') || '';
84
+ const limit = parseInt(url.searchParams.get('limit') || '20', 10);
85
+ const mode = url.searchParams.get('mode') || 'exact'; // exact, fuzzy, hybrid, vector
86
+ const maxContentLength = parseInt(url.searchParams.get('max_content_length') || '200', 10);
87
+ const extraFilesCount = parseInt(url.searchParams.get('extra_files_count') || '10', 10);
88
+ const projectPath = url.searchParams.get('path') || initialPath;
89
+ if (!query) {
90
+ res.writeHead(400, { 'Content-Type': 'application/json' });
91
+ res.end(JSON.stringify({ success: false, error: 'Query parameter is required' }));
92
+ return true;
93
+ }
94
+ try {
95
+ // Request more results to support split (full content + extra files)
96
+ const totalToFetch = limit + extraFilesCount;
97
+ // Use --method instead of deprecated --mode
98
+ const args = ['search', query, '--path', projectPath, '--limit', totalToFetch.toString(), '--method', mode, '--json'];
99
+ const result = await executeCodexLens(args, { cwd: projectPath });
100
+ if (result.success) {
101
+ try {
102
+ const parsed = extractJSON(result.output ?? '');
103
+ const allResults = parsed.result?.results || [];
104
+ // Truncate content and split results
105
+ const truncateContent = (content) => {
106
+ if (!content)
107
+ return '';
108
+ if (content.length <= maxContentLength)
109
+ return content;
110
+ return content.slice(0, maxContentLength) + '...';
111
+ };
112
+ // Split results: first N with full content, rest as file paths only
113
+ const resultsWithContent = allResults.slice(0, limit).map((r) => ({
114
+ ...r,
115
+ content: truncateContent(r.content || r.excerpt),
116
+ excerpt: truncateContent(r.excerpt || r.content),
117
+ }));
118
+ const extraResults = allResults.slice(limit, limit + extraFilesCount);
119
+ const extraFiles = [...new Set(extraResults.map((r) => r.path || r.file))];
120
+ res.writeHead(200, { 'Content-Type': 'application/json' });
121
+ res.end(JSON.stringify({
122
+ success: true,
123
+ results: resultsWithContent,
124
+ extra_files: extraFiles.length > 0 ? extraFiles : undefined,
125
+ metadata: {
126
+ total: allResults.length,
127
+ limit,
128
+ max_content_length: maxContentLength,
129
+ extra_files_count: extraFilesCount,
130
+ },
131
+ }));
132
+ }
133
+ catch {
134
+ res.writeHead(200, { 'Content-Type': 'application/json' });
135
+ res.end(JSON.stringify({ success: true, results: [], output: result.output }));
136
+ }
137
+ }
138
+ else {
139
+ res.writeHead(500, { 'Content-Type': 'application/json' });
140
+ res.end(JSON.stringify({ success: false, error: result.error }));
141
+ }
142
+ }
143
+ catch (err) {
144
+ res.writeHead(500, { 'Content-Type': 'application/json' });
145
+ res.end(JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }));
146
+ }
147
+ return true;
148
+ }
149
+ // API: CodexLens Search Files Only (return file paths only, with mode support)
150
+ if (pathname === '/api/codexlens/search_files') {
151
+ const query = url.searchParams.get('query') || '';
152
+ const limit = parseInt(url.searchParams.get('limit') || '20', 10);
153
+ const mode = url.searchParams.get('mode') || 'exact'; // exact, fuzzy, hybrid, vector
154
+ const projectPath = url.searchParams.get('path') || initialPath;
155
+ if (!query) {
156
+ res.writeHead(400, { 'Content-Type': 'application/json' });
157
+ res.end(JSON.stringify({ success: false, error: 'Query parameter is required' }));
158
+ return true;
159
+ }
160
+ try {
161
+ // Use --method instead of deprecated --mode
162
+ const args = ['search', query, '--path', projectPath, '--limit', limit.toString(), '--method', mode, '--files-only', '--json'];
163
+ const result = await executeCodexLens(args, { cwd: projectPath });
164
+ if (result.success) {
165
+ try {
166
+ const parsed = extractJSON(result.output ?? '');
167
+ res.writeHead(200, { 'Content-Type': 'application/json' });
168
+ res.end(JSON.stringify({ success: true, ...parsed.result }));
169
+ }
170
+ catch {
171
+ res.writeHead(200, { 'Content-Type': 'application/json' });
172
+ res.end(JSON.stringify({ success: true, files: [], output: result.output }));
173
+ }
174
+ }
175
+ else {
176
+ res.writeHead(500, { 'Content-Type': 'application/json' });
177
+ res.end(JSON.stringify({ success: false, error: result.error }));
178
+ }
179
+ }
180
+ catch (err) {
181
+ res.writeHead(500, { 'Content-Type': 'application/json' });
182
+ res.end(JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }));
183
+ }
184
+ return true;
185
+ }
186
+ // API: CodexLens Symbol Search (search for symbols by name)
187
+ if (pathname === '/api/codexlens/symbol') {
188
+ const query = url.searchParams.get('query') || '';
189
+ const file = url.searchParams.get('file');
190
+ const limit = parseInt(url.searchParams.get('limit') || '20', 10);
191
+ const projectPath = url.searchParams.get('path') || initialPath;
192
+ if (!query && !file) {
193
+ res.writeHead(400, { 'Content-Type': 'application/json' });
194
+ res.end(JSON.stringify({ success: false, error: 'Either query or file parameter is required' }));
195
+ return true;
196
+ }
197
+ try {
198
+ let args;
199
+ if (file) {
200
+ // Get symbols from a specific file
201
+ args = ['symbol', '--file', file, '--json'];
202
+ }
203
+ else {
204
+ // Search for symbols by name
205
+ args = ['symbol', query, '--path', projectPath, '--limit', limit.toString(), '--json'];
206
+ }
207
+ const result = await executeCodexLens(args, { cwd: projectPath });
208
+ if (result.success) {
209
+ try {
210
+ const parsed = extractJSON(result.output ?? '');
211
+ res.writeHead(200, { 'Content-Type': 'application/json' });
212
+ res.end(JSON.stringify({ success: true, ...parsed.result }));
213
+ }
214
+ catch {
215
+ res.writeHead(200, { 'Content-Type': 'application/json' });
216
+ res.end(JSON.stringify({ success: true, symbols: [], output: result.output }));
217
+ }
218
+ }
219
+ else {
220
+ res.writeHead(500, { 'Content-Type': 'application/json' });
221
+ res.end(JSON.stringify({ success: false, error: result.error }));
222
+ }
223
+ }
224
+ catch (err) {
225
+ res.writeHead(500, { 'Content-Type': 'application/json' });
226
+ res.end(JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }));
227
+ }
228
+ return true;
229
+ }
230
+ // API: CodexLens Semantic Search Install (with GPU mode support)
231
+ if (pathname === '/api/codexlens/semantic/install' && req.method === 'POST') {
232
+ handlePostRequest(req, res, async (body) => {
233
+ try {
234
+ // Get GPU mode from request body, default to 'cpu'
235
+ const { gpuMode } = body;
236
+ const resolvedGpuModeCandidate = typeof gpuMode === 'string' && gpuMode.trim().length > 0 ? gpuMode : 'cpu';
237
+ const validModes = ['cpu', 'cuda', 'directml'];
238
+ if (!validModes.includes(resolvedGpuModeCandidate)) {
239
+ return {
240
+ success: false,
241
+ error: `Invalid GPU mode: ${resolvedGpuModeCandidate}. Valid modes: ${validModes.join(', ')}`,
242
+ status: 400
243
+ };
244
+ }
245
+ const resolvedGpuMode = resolvedGpuModeCandidate;
246
+ const result = await installSemantic(resolvedGpuMode);
247
+ if (result.success) {
248
+ const status = await checkSemanticStatus();
249
+ const modeDescriptions = {
250
+ cpu: 'CPU (ONNX Runtime)',
251
+ cuda: 'NVIDIA CUDA GPU',
252
+ directml: 'Windows DirectML GPU'
253
+ };
254
+ return {
255
+ success: true,
256
+ message: `Semantic search installed successfully with ${modeDescriptions[resolvedGpuMode]}`,
257
+ gpuMode: resolvedGpuMode,
258
+ ...status
259
+ };
260
+ }
261
+ else {
262
+ return { success: false, error: result.error, status: 500 };
263
+ }
264
+ }
265
+ catch (err) {
266
+ return { success: false, error: err instanceof Error ? err.message : String(err), status: 500 };
267
+ }
268
+ });
269
+ return true;
270
+ }
271
+ // ============================================================
272
+ // RERANKER CONFIGURATION ENDPOINTS
273
+ // ============================================================
274
+ // API: Get Reranker Configuration
275
+ if (pathname === '/api/codexlens/reranker/config' && req.method === 'GET') {
276
+ try {
277
+ const venvStatus = await checkVenvStatus();
278
+ // Default reranker config (matches fastembed default)
279
+ const rerankerConfig = {
280
+ backend: 'fastembed',
281
+ model_name: 'Xenova/ms-marco-MiniLM-L-6-v2',
282
+ api_provider: 'siliconflow',
283
+ api_key_set: false,
284
+ available_backends: ['onnx', 'api', 'litellm', 'legacy'],
285
+ api_providers: ['siliconflow', 'cohere', 'jina'],
286
+ litellm_endpoints: [],
287
+ config_source: 'default'
288
+ };
289
+ // Load LiteLLM reranker models for dropdown (from litellm-api-config providers)
290
+ try {
291
+ const availableRerankerModels = getAvailableModelsForType(initialPath, 'reranker');
292
+ if (availableRerankerModels && Array.isArray(availableRerankerModels)) {
293
+ // Return full model info for frontend to use
294
+ rerankerConfig.litellm_models = availableRerankerModels.map((m) => ({
295
+ modelId: m.modelId,
296
+ modelName: m.modelName,
297
+ providers: m.providers
298
+ }));
299
+ // Keep litellm_endpoints for backward compatibility (just model IDs)
300
+ rerankerConfig.litellm_endpoints = availableRerankerModels.map((m) => m.modelId);
301
+ }
302
+ }
303
+ catch {
304
+ // LiteLLM config not available, continue with empty models
305
+ }
306
+ // If CodexLens is installed, try to get actual config
307
+ if (venvStatus.ready) {
308
+ try {
309
+ const result = await executeCodexLens(['config', '--json']);
310
+ if (result.success) {
311
+ const config = extractJSON(result.output ?? '');
312
+ if (config.success && config.result) {
313
+ // Map config values
314
+ if (config.result.reranker_backend) {
315
+ rerankerConfig.backend = config.result.reranker_backend;
316
+ rerankerConfig.config_source = 'codexlens';
317
+ }
318
+ if (config.result.reranker_model) {
319
+ rerankerConfig.model_name = config.result.reranker_model;
320
+ }
321
+ if (config.result.reranker_api_provider) {
322
+ rerankerConfig.api_provider = config.result.reranker_api_provider;
323
+ }
324
+ // Check if API key is set (from env)
325
+ if (process.env.RERANKER_API_KEY) {
326
+ rerankerConfig.api_key_set = true;
327
+ }
328
+ }
329
+ }
330
+ }
331
+ catch (e) {
332
+ console.error('[CodexLens] Failed to get reranker config:', e);
333
+ }
334
+ }
335
+ res.writeHead(200, { 'Content-Type': 'application/json' });
336
+ res.end(JSON.stringify({ success: true, ...rerankerConfig }));
337
+ }
338
+ catch (err) {
339
+ res.writeHead(500, { 'Content-Type': 'application/json' });
340
+ res.end(JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }));
341
+ }
342
+ return true;
343
+ }
344
+ // API: Set Reranker Configuration
345
+ if (pathname === '/api/codexlens/reranker/config' && req.method === 'POST') {
346
+ handlePostRequest(req, res, async (body) => {
347
+ const { backend, model_name, api_provider, api_key, litellm_endpoint } = body;
348
+ const resolvedBackend = typeof backend === 'string' && backend.trim().length > 0 ? backend : undefined;
349
+ const resolvedModelName = typeof model_name === 'string' && model_name.trim().length > 0 ? model_name : undefined;
350
+ const resolvedApiProvider = typeof api_provider === 'string' && api_provider.trim().length > 0 ? api_provider : undefined;
351
+ const resolvedApiKey = typeof api_key === 'string' && api_key.trim().length > 0 ? api_key : undefined;
352
+ const resolvedLiteLLMEndpoint = typeof litellm_endpoint === 'string' && litellm_endpoint.trim().length > 0 ? litellm_endpoint : undefined;
353
+ // Validate backend
354
+ const validBackends = ['onnx', 'api', 'litellm', 'legacy', 'fastembed'];
355
+ if (resolvedBackend && !validBackends.includes(resolvedBackend)) {
356
+ return {
357
+ success: false,
358
+ error: `Invalid backend: ${resolvedBackend}. Valid options: ${validBackends.join(', ')}`,
359
+ status: 400
360
+ };
361
+ }
362
+ // Validate api_provider
363
+ const validProviders = ['siliconflow', 'cohere', 'jina'];
364
+ if (resolvedApiProvider && !validProviders.includes(resolvedApiProvider)) {
365
+ return {
366
+ success: false,
367
+ error: `Invalid api_provider: ${resolvedApiProvider}. Valid options: ${validProviders.join(', ')}`,
368
+ status: 400
369
+ };
370
+ }
371
+ try {
372
+ const updates = [];
373
+ // Special handling for litellm backend - auto-configure from litellm-api-config
374
+ if (resolvedBackend === 'litellm' && (resolvedModelName || resolvedLiteLLMEndpoint)) {
375
+ const selectedModel = (resolvedModelName || resolvedLiteLLMEndpoint);
376
+ // Find the provider that has this model
377
+ const providers = getAllProviders(initialPath);
378
+ let providerWithModel = null;
379
+ let foundModel = null;
380
+ for (const provider of providers) {
381
+ if (!provider.enabled || !provider.rerankerModels)
382
+ continue;
383
+ const model = provider.rerankerModels.find((m) => m.id === selectedModel && m.enabled);
384
+ if (model) {
385
+ providerWithModel = provider;
386
+ foundModel = model;
387
+ break;
388
+ }
389
+ }
390
+ if (providerWithModel) {
391
+ // Set backend to litellm
392
+ const backendResult = await executeCodexLens(['config', 'set', 'reranker_backend', 'litellm', '--json']);
393
+ if (backendResult.success)
394
+ updates.push('backend');
395
+ // Set model
396
+ const modelResult = await executeCodexLens(['config', 'set', 'reranker_model', selectedModel, '--json']);
397
+ if (modelResult.success)
398
+ updates.push('model_name');
399
+ // Auto-configure API credentials from provider
400
+ // Write to CodexLens .env file for persistence
401
+ const { writeFileSync, existsSync, readFileSync } = await import('fs');
402
+ const { join } = await import('path');
403
+ const { homedir } = await import('os');
404
+ const codexlensDir = join(homedir(), '.codexlens');
405
+ const envFile = join(codexlensDir, '.env');
406
+ // Read existing .env content
407
+ let envContent = '';
408
+ if (existsSync(envFile)) {
409
+ envContent = readFileSync(envFile, 'utf-8');
410
+ }
411
+ // Update or add RERANKER_API_KEY and RERANKER_API_BASE
412
+ const apiKey = providerWithModel.apiKey;
413
+ const apiBase = providerWithModel.apiBase;
414
+ // Helper to update env var in content
415
+ const updateEnvVar = (content, key, value) => {
416
+ const regex = new RegExp(`^${key}=.*$`, 'm');
417
+ const newLine = `${key}="${value}"`;
418
+ if (regex.test(content)) {
419
+ return content.replace(regex, newLine);
420
+ }
421
+ else {
422
+ return content.trim() + '\n' + newLine;
423
+ }
424
+ };
425
+ if (apiKey) {
426
+ envContent = updateEnvVar(envContent, 'RERANKER_API_KEY', apiKey);
427
+ envContent = updateEnvVar(envContent, 'CODEXLENS_RERANKER_API_KEY', apiKey);
428
+ process.env.RERANKER_API_KEY = apiKey;
429
+ updates.push('api_key (auto-configured)');
430
+ }
431
+ if (apiBase) {
432
+ envContent = updateEnvVar(envContent, 'RERANKER_API_BASE', apiBase);
433
+ envContent = updateEnvVar(envContent, 'CODEXLENS_RERANKER_API_BASE', apiBase);
434
+ process.env.RERANKER_API_BASE = apiBase;
435
+ updates.push('api_base (auto-configured)');
436
+ }
437
+ // Write updated .env
438
+ writeFileSync(envFile, envContent.trim() + '\n', 'utf-8');
439
+ return {
440
+ success: true,
441
+ message: `LiteLLM backend configured with model: ${selectedModel}`,
442
+ updated_fields: updates,
443
+ provider: providerWithModel.name,
444
+ auto_configured: true
445
+ };
446
+ }
447
+ else {
448
+ return {
449
+ success: false,
450
+ error: `Model "${selectedModel}" not found in any enabled LiteLLM provider. Please configure it in API Settings first.`,
451
+ status: 400
452
+ };
453
+ }
454
+ }
455
+ // Standard handling for non-litellm backends
456
+ // Set backend
457
+ if (resolvedBackend) {
458
+ const result = await executeCodexLens(['config', 'set', 'reranker_backend', resolvedBackend, '--json']);
459
+ if (result.success)
460
+ updates.push('backend');
461
+ }
462
+ // Set model
463
+ if (resolvedModelName) {
464
+ const result = await executeCodexLens(['config', 'set', 'reranker_model', resolvedModelName, '--json']);
465
+ if (result.success)
466
+ updates.push('model_name');
467
+ }
468
+ // Set API provider
469
+ if (resolvedApiProvider) {
470
+ const result = await executeCodexLens(['config', 'set', 'reranker_api_provider', resolvedApiProvider, '--json']);
471
+ if (result.success)
472
+ updates.push('api_provider');
473
+ }
474
+ // Set LiteLLM endpoint (for backward compatibility)
475
+ if (resolvedLiteLLMEndpoint && resolvedBackend !== 'litellm') {
476
+ const result = await executeCodexLens([
477
+ 'config',
478
+ 'set',
479
+ 'reranker_litellm_endpoint',
480
+ resolvedLiteLLMEndpoint,
481
+ '--json'
482
+ ]);
483
+ if (result.success)
484
+ updates.push('litellm_endpoint');
485
+ }
486
+ // Handle API key - write to .env file or environment
487
+ if (resolvedApiKey) {
488
+ // For security, we store in process.env for the current session
489
+ // In production, this should be written to a secure .env file
490
+ process.env.RERANKER_API_KEY = resolvedApiKey;
491
+ updates.push('api_key');
492
+ }
493
+ return {
494
+ success: true,
495
+ message: `Updated: ${updates.join(', ')}`,
496
+ updated_fields: updates
497
+ };
498
+ }
499
+ catch (err) {
500
+ return { success: false, error: err instanceof Error ? err.message : String(err), status: 500 };
501
+ }
502
+ });
503
+ return true;
504
+ }
505
+ // ============================================================
506
+ // RERANKER MODEL MANAGEMENT ENDPOINTS
507
+ // ============================================================
508
+ // API: List Reranker Models (list available reranker models)
509
+ if (pathname === '/api/codexlens/reranker/models' && req.method === 'GET') {
510
+ try {
511
+ // Check if CodexLens is installed first
512
+ const venvStatus = await checkVenvStatus();
513
+ if (!venvStatus.ready) {
514
+ res.writeHead(200, { 'Content-Type': 'application/json' });
515
+ res.end(JSON.stringify({ success: false, error: 'CodexLens not installed' }));
516
+ return true;
517
+ }
518
+ const result = await executeCodexLens(['reranker-model-list', '--json']);
519
+ if (result.success) {
520
+ try {
521
+ const parsed = extractJSON(result.output ?? '');
522
+ res.writeHead(200, { 'Content-Type': 'application/json' });
523
+ res.end(JSON.stringify(parsed));
524
+ }
525
+ catch {
526
+ res.writeHead(200, { 'Content-Type': 'application/json' });
527
+ res.end(JSON.stringify({ success: true, result: { models: [] }, output: result.output }));
528
+ }
529
+ }
530
+ else {
531
+ res.writeHead(500, { 'Content-Type': 'application/json' });
532
+ res.end(JSON.stringify({ success: false, error: result.error }));
533
+ }
534
+ }
535
+ catch (err) {
536
+ res.writeHead(500, { 'Content-Type': 'application/json' });
537
+ res.end(JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }));
538
+ }
539
+ return true;
540
+ }
541
+ // API: Download Reranker Model (download reranker model by profile)
542
+ if (pathname === '/api/codexlens/reranker/models/download' && req.method === 'POST') {
543
+ handlePostRequest(req, res, async (body) => {
544
+ const { profile } = body;
545
+ const resolvedProfile = typeof profile === 'string' && profile.trim().length > 0 ? profile.trim() : undefined;
546
+ if (!resolvedProfile) {
547
+ return { success: false, error: 'profile is required', status: 400 };
548
+ }
549
+ try {
550
+ const result = await executeCodexLens(['reranker-model-download', resolvedProfile, '--json'], { timeout: 600000 }); // 10 min for download
551
+ if (result.success) {
552
+ try {
553
+ const parsed = extractJSON(result.output ?? '');
554
+ return { success: true, ...parsed };
555
+ }
556
+ catch {
557
+ return { success: true, output: result.output };
558
+ }
559
+ }
560
+ else {
561
+ return { success: false, error: result.error, status: 500 };
562
+ }
563
+ }
564
+ catch (err) {
565
+ return { success: false, error: err instanceof Error ? err.message : String(err), status: 500 };
566
+ }
567
+ });
568
+ return true;
569
+ }
570
+ // API: Delete Reranker Model (delete reranker model by profile)
571
+ if (pathname === '/api/codexlens/reranker/models/delete' && req.method === 'POST') {
572
+ handlePostRequest(req, res, async (body) => {
573
+ const { profile } = body;
574
+ const resolvedProfile = typeof profile === 'string' && profile.trim().length > 0 ? profile.trim() : undefined;
575
+ if (!resolvedProfile) {
576
+ return { success: false, error: 'profile is required', status: 400 };
577
+ }
578
+ try {
579
+ const result = await executeCodexLens(['reranker-model-delete', resolvedProfile, '--json']);
580
+ if (result.success) {
581
+ try {
582
+ const parsed = extractJSON(result.output ?? '');
583
+ return { success: true, ...parsed };
584
+ }
585
+ catch {
586
+ return { success: true, output: result.output };
587
+ }
588
+ }
589
+ else {
590
+ return { success: false, error: result.error, status: 500 };
591
+ }
592
+ }
593
+ catch (err) {
594
+ return { success: false, error: err instanceof Error ? err.message : String(err), status: 500 };
595
+ }
596
+ });
597
+ return true;
598
+ }
599
+ // API: Reranker Model Info (get reranker model info by profile)
600
+ if (pathname === '/api/codexlens/reranker/models/info' && req.method === 'GET') {
601
+ const profile = url.searchParams.get('profile');
602
+ if (!profile) {
603
+ res.writeHead(400, { 'Content-Type': 'application/json' });
604
+ res.end(JSON.stringify({ success: false, error: 'profile parameter is required' }));
605
+ return true;
606
+ }
607
+ try {
608
+ const result = await executeCodexLens(['reranker-model-info', profile, '--json']);
609
+ if (result.success) {
610
+ try {
611
+ const parsed = extractJSON(result.output ?? '');
612
+ res.writeHead(200, { 'Content-Type': 'application/json' });
613
+ res.end(JSON.stringify(parsed));
614
+ }
615
+ catch {
616
+ res.writeHead(200, { 'Content-Type': 'application/json' });
617
+ res.end(JSON.stringify({ success: false, error: 'Failed to parse response' }));
618
+ }
619
+ }
620
+ else {
621
+ res.writeHead(500, { 'Content-Type': 'application/json' });
622
+ res.end(JSON.stringify({ success: false, error: result.error }));
623
+ }
624
+ }
625
+ catch (err) {
626
+ res.writeHead(500, { 'Content-Type': 'application/json' });
627
+ res.end(JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }));
628
+ }
629
+ return true;
630
+ }
631
+ // ============================================================
632
+ // SPLADE ENDPOINTS
633
+ // ============================================================
634
+ // API: SPLADE Status - Check if SPLADE is available and installed
635
+ if (pathname === '/api/codexlens/splade/status') {
636
+ try {
637
+ // Check if CodexLens is installed first
638
+ const venvStatus = await checkVenvStatus();
639
+ if (!venvStatus.ready) {
640
+ res.writeHead(200, { 'Content-Type': 'application/json' });
641
+ res.end(JSON.stringify({
642
+ available: false,
643
+ installed: false,
644
+ model: 'naver/splade-cocondenser-ensembledistil',
645
+ error: 'CodexLens not installed'
646
+ }));
647
+ return true;
648
+ }
649
+ // Check SPLADE availability using Python check
650
+ const result = await executeCodexLens(['python', '-c',
651
+ 'from codexlens.semantic.splade_encoder import check_splade_available; ok, err = check_splade_available(); print(\"OK\" if ok else err)'
652
+ ]);
653
+ const output = result.output ?? '';
654
+ const available = output.includes('OK');
655
+ res.writeHead(200, { 'Content-Type': 'application/json' });
656
+ res.end(JSON.stringify({
657
+ available,
658
+ installed: available,
659
+ model: 'naver/splade-cocondenser-ensembledistil',
660
+ error: available ? null : output.trim()
661
+ }));
662
+ }
663
+ catch (err) {
664
+ res.writeHead(200, { 'Content-Type': 'application/json' });
665
+ res.end(JSON.stringify({
666
+ available: false,
667
+ installed: false,
668
+ model: 'naver/splade-cocondenser-ensembledistil',
669
+ error: err instanceof Error ? err.message : String(err)
670
+ }));
671
+ }
672
+ return true;
673
+ }
674
+ // API: SPLADE Install - Install SPLADE dependencies
675
+ if (pathname === '/api/codexlens/splade/install' && req.method === 'POST') {
676
+ handlePostRequest(req, res, async (body) => {
677
+ try {
678
+ const { gpu } = body;
679
+ const useGpu = typeof gpu === 'boolean' ? gpu : false;
680
+ const extras = useGpu ? ['splade-gpu'] : ['splade'];
681
+ // Priority: Use UV if available (faster, better dependency resolution)
682
+ if (await isUvAvailable()) {
683
+ console.log('[SPLADE Install] Using UV for installation...');
684
+ const uv = createCodexLensUvManager();
685
+ // Ensure venv exists
686
+ if (!uv.isVenvValid()) {
687
+ console.log('[SPLADE Install] Venv not valid, creating...');
688
+ const venvResult = await uv.createVenv();
689
+ if (!venvResult.success) {
690
+ throw new Error(`Failed to create venv: ${venvResult.error}`);
691
+ }
692
+ }
693
+ // Find local codex-lens package
694
+ const { existsSync } = await import('fs');
695
+ const { join, dirname } = await import('path');
696
+ const { fileURLToPath } = await import('url');
697
+ const __filename = fileURLToPath(import.meta.url);
698
+ const __dirname = dirname(__filename);
699
+ // Look for local codex-lens package
700
+ const possiblePaths = [
701
+ join(__dirname, '..', '..', '..', '..', '..', 'codex-lens'),
702
+ join(__dirname, '..', '..', '..', '..', '..', '..', 'codex-lens'),
703
+ join(process.cwd(), 'codex-lens'),
704
+ ];
705
+ let codexLensPath = null;
706
+ for (const p of possiblePaths) {
707
+ if (existsSync(join(p, 'pyproject.toml'))) {
708
+ codexLensPath = p;
709
+ break;
710
+ }
711
+ }
712
+ if (codexLensPath) {
713
+ // Install from local project with extras
714
+ const result = await uv.installFromProject(codexLensPath, extras);
715
+ if (result.success) {
716
+ return {
717
+ success: true,
718
+ message: `SPLADE installed successfully via UV (${useGpu ? 'GPU' : 'CPU'} mode)`,
719
+ duration: result.duration
720
+ };
721
+ }
722
+ console.log('[SPLADE Install] UV install failed, falling back to pip:', result.error);
723
+ }
724
+ else {
725
+ // Install from PyPI with extras
726
+ const packageSpec = `codex-lens[${extras.join(',')}]`;
727
+ const result = await uv.install([packageSpec]);
728
+ if (result.success) {
729
+ return {
730
+ success: true,
731
+ message: `SPLADE installed successfully via UV from PyPI (${useGpu ? 'GPU' : 'CPU'} mode)`,
732
+ duration: result.duration
733
+ };
734
+ }
735
+ console.log('[SPLADE Install] UV install failed, falling back to pip:', result.error);
736
+ }
737
+ }
738
+ // Fallback: Use pip for installation
739
+ console.log('[SPLADE Install] Using pip fallback...');
740
+ const packageName = useGpu ? 'codex-lens[splade-gpu]' : 'codex-lens[splade]';
741
+ const { promisify } = await import('util');
742
+ const execFilePromise = promisify(require('child_process').execFile);
743
+ const result = await execFilePromise('pip', ['install', packageName], {
744
+ timeout: 600000 // 10 minutes
745
+ });
746
+ return {
747
+ success: true,
748
+ message: `SPLADE installed successfully via pip (${useGpu ? 'GPU' : 'CPU'} mode)`,
749
+ output: result.stdout
750
+ };
751
+ }
752
+ catch (err) {
753
+ const message = err instanceof Error ? err.message : String(err);
754
+ const stderr = err?.stderr;
755
+ return {
756
+ success: false,
757
+ error: message,
758
+ stderr: typeof stderr === 'string' ? stderr : undefined,
759
+ status: 500
760
+ };
761
+ }
762
+ });
763
+ return true;
764
+ }
765
+ // API: SPLADE Index Status - Check if SPLADE index exists for a project
766
+ if (pathname === '/api/codexlens/splade/index-status') {
767
+ try {
768
+ const projectPath = url.searchParams.get('path');
769
+ if (!projectPath) {
770
+ res.writeHead(400, { 'Content-Type': 'application/json' });
771
+ res.end(JSON.stringify({ success: false, error: 'Missing path parameter' }));
772
+ return true;
773
+ }
774
+ // Check if CodexLens is installed first
775
+ const venvStatus = await checkVenvStatus();
776
+ if (!venvStatus.ready) {
777
+ res.writeHead(200, { 'Content-Type': 'application/json' });
778
+ res.end(JSON.stringify({ exists: false, error: 'CodexLens not installed' }));
779
+ return true;
780
+ }
781
+ const { join } = await import('path');
782
+ const indexDb = join(projectPath, '.codexlens', '_index.db');
783
+ // Use Python to check SPLADE index status
784
+ const pythonCode = `
785
+ from codexlens.storage.splade_index import SpladeIndex
786
+ from pathlib import Path
787
+ try:
788
+ idx = SpladeIndex(Path(\"${indexDb.replace(/\\\\/g, '\\\\\\\\')}\"))
789
+ if idx.has_index():
790
+ stats = idx.get_stats()
791
+ meta = idx.get_metadata()
792
+ model = meta.get('model_name', '') if meta else ''
793
+ print(f\"OK|{stats['unique_chunks']}|{stats['total_postings']}|{model}\")
794
+ else:
795
+ print(\"NO_INDEX\")
796
+ except Exception as e:
797
+ print(f\"ERROR|{str(e)}\")
798
+ `;
799
+ const result = await executeCodexLens(['python', '-c', pythonCode]);
800
+ const output = result.output ?? '';
801
+ if (output.startsWith('OK|')) {
802
+ const parts = output.trim().split('|');
803
+ res.writeHead(200, { 'Content-Type': 'application/json' });
804
+ res.end(JSON.stringify({
805
+ exists: true,
806
+ chunks: parseInt(parts[1]),
807
+ postings: parseInt(parts[2]),
808
+ model: parts[3]
809
+ }));
810
+ }
811
+ else if (output.startsWith('ERROR|')) {
812
+ const errorMsg = output.substring(6).trim();
813
+ res.writeHead(200, { 'Content-Type': 'application/json' });
814
+ res.end(JSON.stringify({ exists: false, error: errorMsg }));
815
+ }
816
+ else {
817
+ res.writeHead(200, { 'Content-Type': 'application/json' });
818
+ res.end(JSON.stringify({ exists: false }));
819
+ }
820
+ }
821
+ catch (err) {
822
+ res.writeHead(200, { 'Content-Type': 'application/json' });
823
+ res.end(JSON.stringify({ exists: false, error: err instanceof Error ? err.message : String(err) }));
824
+ }
825
+ return true;
826
+ }
827
+ // API: SPLADE Index Rebuild - Rebuild SPLADE index for a project
828
+ if (pathname === '/api/codexlens/splade/rebuild' && req.method === 'POST') {
829
+ handlePostRequest(req, res, async (body) => {
830
+ const { path: projectPath } = body;
831
+ const resolvedProjectPath = typeof projectPath === 'string' && projectPath.trim().length > 0 ? projectPath : undefined;
832
+ if (!resolvedProjectPath) {
833
+ return { success: false, error: 'Missing path parameter', status: 400 };
834
+ }
835
+ try {
836
+ // Use 'index splade' instead of deprecated 'splade-index'
837
+ const result = await executeCodexLens(['index', 'splade', resolvedProjectPath, '--rebuild'], {
838
+ cwd: resolvedProjectPath,
839
+ timeout: 1800000 // 30 minutes for large codebases
840
+ });
841
+ if (result.success) {
842
+ return {
843
+ success: true,
844
+ message: 'SPLADE index rebuilt successfully',
845
+ output: result.output
846
+ };
847
+ }
848
+ else {
849
+ return {
850
+ success: false,
851
+ error: result.error || 'Failed to rebuild SPLADE index',
852
+ output: result.output,
853
+ status: 500
854
+ };
855
+ }
856
+ }
857
+ catch (err) {
858
+ return { success: false, error: err instanceof Error ? err.message : String(err), status: 500 };
859
+ }
860
+ });
861
+ return true;
862
+ }
863
+ return false;
864
+ }
865
+ //# sourceMappingURL=semantic-handlers.js.map