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.
- package/.claude/CLAUDE.md +8 -5
- package/.claude/agents/action-planning-agent.md +26 -2
- package/.claude/agents/code-developer.md +132 -43
- package/.claude/agents/debug-explore-agent.md +434 -0
- package/.claude/agents/issue-plan-agent.md +31 -2
- package/.claude/agents/test-fix-agent.md +14 -0
- package/.claude/commands/issue/discover.md +41 -0
- package/.claude/commands/issue/execute.md +200 -19
- package/.claude/commands/issue/new.md +93 -3
- package/.claude/commands/issue/plan.md +9 -3
- package/.claude/commands/issue/queue.md +94 -39
- package/.claude/commands/memory/swagger-docs.md +773 -0
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
- package/.claude/commands/workflow/execute.md +54 -34
- package/.claude/commands/workflow/lite-execute.md +48 -164
- package/.claude/commands/workflow/lite-fix.md +4 -4
- package/.claude/commands/workflow/lite-plan.md +5 -5
- package/.claude/commands/workflow/plan.md +27 -27
- package/.claude/commands/workflow/review.md +42 -17
- package/.claude/commands/workflow/tdd-plan.md +25 -25
- package/.claude/commands/workflow/test-fix-gen.md +10 -10
- package/.claude/commands/workflow/test-gen.md +14 -14
- package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
- package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
- package/.claude/skills/ccw/SKILL.md +462 -0
- package/.claude/skills/ccw/index/command-capabilities.json +127 -0
- package/.claude/skills/ccw/index/intent-rules.json +136 -0
- package/.claude/skills/ccw/index/workflow-chains.json +451 -0
- package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
- package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
- package/.claude/skills/ccw/phases/actions/docs.md +93 -0
- package/.claude/skills/ccw/phases/actions/full.md +154 -0
- package/.claude/skills/ccw/phases/actions/issue.md +201 -0
- package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
- package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
- package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
- package/.claude/skills/ccw/phases/actions/ui.md +79 -0
- package/.claude/skills/ccw/phases/orchestrator.md +435 -0
- package/.claude/skills/ccw/specs/intent-classification.md +336 -0
- package/.claude/skills/ccw-help/SKILL.md +177 -0
- package/.claude/skills/ccw-help/index/all-agents.json +82 -0
- package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
- package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
- package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
- package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
- package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
- package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
- package/.claude/skills/code-reviewer/README.md +340 -0
- package/.claude/skills/code-reviewer/SKILL.md +308 -0
- package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
- package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
- package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
- package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
- package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
- package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
- package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
- package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
- package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
- package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
- package/.claude/skills/skill-generator/SKILL.md +187 -0
- package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
- package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
- package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
- package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
- package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
- package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
- package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
- package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
- package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
- package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
- package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
- package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
- package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
- package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
- package/.claude/skills/skill-generator/templates/script-python.md +198 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
- package/.claude/workflows/chinese-response.md +15 -28
- package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
- package/.claude/workflows/cli-tools-usage.md +221 -177
- package/.claude/workflows/windows-platform.md +13 -10
- package/.codex/prompts/issue-execute.md +310 -82
- package/.codex/prompts/issue-queue.md +22 -0
- package/.codex/prompts/lite-execute.md +36 -11
- package/README.md +309 -305
- package/ccw/README.md +10 -4
- package/ccw/dist/cli.d.ts.map +1 -1
- package/ccw/dist/cli.js +4 -1
- package/ccw/dist/cli.js.map +1 -1
- package/ccw/dist/commands/cli.d.ts.map +1 -1
- package/ccw/dist/commands/cli.js +131 -34
- package/ccw/dist/commands/cli.js.map +1 -1
- package/ccw/dist/commands/issue.d.ts +152 -0
- package/ccw/dist/commands/issue.d.ts.map +1 -1
- package/ccw/dist/commands/issue.js +550 -85
- package/ccw/dist/commands/issue.js.map +1 -1
- package/ccw/dist/commands/serve.d.ts +1 -0
- package/ccw/dist/commands/serve.d.ts.map +1 -1
- package/ccw/dist/commands/serve.js +12 -5
- package/ccw/dist/commands/serve.js.map +1 -1
- package/ccw/dist/commands/stop.d.ts.map +1 -1
- package/ccw/dist/commands/stop.js +29 -5
- package/ccw/dist/commands/stop.js.map +1 -1
- package/ccw/dist/commands/tool.d.ts.map +1 -1
- package/ccw/dist/commands/tool.js +19 -2
- package/ccw/dist/commands/tool.js.map +1 -1
- package/ccw/dist/commands/view.d.ts +1 -0
- package/ccw/dist/commands/view.d.ts.map +1 -1
- package/ccw/dist/commands/view.js +10 -3
- package/ccw/dist/commands/view.js.map +1 -1
- package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
- package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
- package/ccw/dist/config/cli-settings-manager.js +392 -0
- package/ccw/dist/config/cli-settings-manager.js.map +1 -0
- package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
- package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
- package/ccw/dist/config/litellm-api-config-manager.js +290 -20
- package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
- package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
- package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
- package/ccw/dist/core/auth/csrf-manager.js +80 -0
- package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
- package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
- package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
- package/ccw/dist/core/auth/csrf-middleware.js +141 -0
- package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
- package/ccw/dist/core/auth/middleware.d.ts +15 -0
- package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
- package/ccw/dist/core/auth/middleware.js +76 -0
- package/ccw/dist/core/auth/middleware.js.map +1 -0
- package/ccw/dist/core/auth/token-manager.d.ts +41 -0
- package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
- package/ccw/dist/core/auth/token-manager.js +171 -0
- package/ccw/dist/core/auth/token-manager.js.map +1 -0
- package/ccw/dist/core/cache-manager.d.ts +6 -6
- package/ccw/dist/core/cache-manager.d.ts.map +1 -1
- package/ccw/dist/core/cache-manager.js +70 -48
- package/ccw/dist/core/cache-manager.js.map +1 -1
- package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
- package/ccw/dist/core/claude-freshness.js +23 -3
- package/ccw/dist/core/claude-freshness.js.map +1 -1
- package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
- package/ccw/dist/core/core-memory-store.js +2 -1
- package/ccw/dist/core/core-memory-store.js.map +1 -1
- package/ccw/dist/core/cors.d.ts +3 -0
- package/ccw/dist/core/cors.d.ts.map +1 -0
- package/ccw/dist/core/cors.js +10 -0
- package/ccw/dist/core/cors.js.map +1 -0
- package/ccw/dist/core/dashboard-generator-patch.js +0 -1
- package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
- package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
- package/ccw/dist/core/dashboard-generator.js +417 -416
- package/ccw/dist/core/dashboard-generator.js.map +1 -1
- package/ccw/dist/core/data-aggregator.js +2 -2
- package/ccw/dist/core/data-aggregator.js.map +1 -1
- package/ccw/dist/core/lite-scanner.d.ts +1 -1
- package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
- package/ccw/dist/core/lite-scanner.js +130 -127
- package/ccw/dist/core/lite-scanner.js.map +1 -1
- package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
- package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/auth-routes.js +80 -0
- package/ccw/dist/core/routes/auth-routes.js.map +1 -0
- package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
- package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/ccw-routes.js +9 -4
- package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
- package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
- package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/claude-routes.js +98 -39
- package/ccw/dist/core/routes/claude-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +122 -43
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
- package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
- package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
- package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/utils.js +85 -0
- package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
- package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.js +10 -981
- package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
- package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
- package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/discovery-routes.js +25 -0
- package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
- package/ccw/dist/core/routes/files-routes.d.ts +1 -14
- package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/files-routes.js +57 -14
- package/ccw/dist/core/routes/files-routes.js.map +1 -1
- package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
- package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/graph-routes.js +36 -37
- package/ccw/dist/core/routes/graph-routes.js.map +1 -1
- package/ccw/dist/core/routes/help-routes.d.ts +1 -14
- package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/help-routes.js +5 -0
- package/ccw/dist/core/routes/help-routes.js.map +1 -1
- package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
- package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/hooks-routes.js +43 -21
- package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
- package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
- package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/issue-routes.js +24 -0
- package/ccw/dist/core/routes/issue-routes.js.map +1 -1
- package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
- package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/litellm-api-routes.js +513 -48
- package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
- package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
- package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/litellm-routes.js +28 -11
- package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
- package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
- package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/mcp-routes.js +99 -30
- package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
- package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
- package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
- package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
- package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/memory-routes.js +74 -24
- package/ccw/dist/core/routes/memory-routes.js.map +1 -1
- package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
- package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/nav-status-routes.js +217 -0
- package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
- package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
- package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/rules-routes.js +481 -58
- package/ccw/dist/core/routes/rules-routes.js.map +1 -1
- package/ccw/dist/core/routes/session-routes.d.ts +1 -14
- package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/session-routes.js +15 -3
- package/ccw/dist/core/routes/session-routes.js.map +1 -1
- package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
- package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/skills-routes.js +394 -112
- package/ccw/dist/core/routes/skills-routes.js.map +1 -1
- package/ccw/dist/core/routes/status-routes.d.ts +1 -14
- package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/status-routes.js +4 -0
- package/ccw/dist/core/routes/status-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.d.ts +4 -10
- package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +6 -4
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/dist/core/routes/types.d.ts +19 -0
- package/ccw/dist/core/routes/types.d.ts.map +1 -0
- package/ccw/dist/core/routes/types.js +2 -0
- package/ccw/dist/core/routes/types.js.map +1 -0
- package/ccw/dist/core/server.d.ts.map +1 -1
- package/ccw/dist/core/server.js +206 -29
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/core/services/api-key-tester.d.ts +42 -0
- package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
- package/ccw/dist/core/services/api-key-tester.js +126 -0
- package/ccw/dist/core/services/api-key-tester.js.map +1 -0
- package/ccw/dist/core/services/health-check-service.d.ts +88 -0
- package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
- package/ccw/dist/core/services/health-check-service.js +293 -0
- package/ccw/dist/core/services/health-check-service.js.map +1 -0
- package/ccw/dist/core/websocket.d.ts +9 -7
- package/ccw/dist/core/websocket.d.ts.map +1 -1
- package/ccw/dist/core/websocket.js +9 -4
- package/ccw/dist/core/websocket.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +490 -100
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
- package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
- package/ccw/dist/tools/cli-config-manager.js +76 -156
- package/ccw/dist/tools/cli-config-manager.js.map +1 -1
- package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
- package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-core.js +1310 -0
- package/ccw/dist/tools/cli-executor-core.js.map +1 -0
- package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
- package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-state.js +392 -0
- package/ccw/dist/tools/cli-executor-state.js.map +1 -0
- package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
- package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-utils.js +298 -0
- package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
- package/ccw/dist/tools/cli-executor.d.ts +3 -377
- package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
- package/ccw/dist/tools/cli-executor.js +3 -1884
- package/ccw/dist/tools/cli-executor.js.map +1 -1
- package/ccw/dist/tools/cli-history-store.d.ts +2 -0
- package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
- package/ccw/dist/tools/cli-history-store.js.map +1 -1
- package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
- package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
- package/ccw/dist/tools/cli-output-converter.js +1047 -0
- package/ccw/dist/tools/cli-output-converter.js.map +1 -0
- package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
- package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
- package/ccw/dist/tools/cli-prompt-builder.js +363 -0
- package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
- package/ccw/dist/tools/codex-lens.d.ts +15 -1
- package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
- package/ccw/dist/tools/codex-lens.js +289 -55
- package/ccw/dist/tools/codex-lens.js.map +1 -1
- package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
- package/ccw/dist/tools/detect-changed-modules.js +22 -4
- package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
- package/ccw/dist/tools/index.d.ts.map +1 -1
- package/ccw/dist/tools/index.js +2 -0
- package/ccw/dist/tools/index.js.map +1 -1
- package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
- package/ccw/dist/tools/litellm-client.js +10 -4
- package/ccw/dist/tools/litellm-client.js.map +1 -1
- package/ccw/dist/tools/litellm-executor.d.ts +2 -4
- package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
- package/ccw/dist/tools/litellm-executor.js +39 -8
- package/ccw/dist/tools/litellm-executor.js.map +1 -1
- package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
- package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
- package/ccw/dist/tools/native-session-discovery.js +197 -1
- package/ccw/dist/tools/native-session-discovery.js.map +1 -1
- package/ccw/dist/tools/session-manager.d.ts.map +1 -1
- package/ccw/dist/tools/session-manager.js +79 -0
- package/ccw/dist/tools/session-manager.js.map +1 -1
- package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
- package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
- package/ccw/dist/tools/skill-context-loader.js +198 -0
- package/ccw/dist/tools/skill-context-loader.js.map +1 -0
- package/ccw/dist/tools/smart-search.d.ts +8 -3
- package/ccw/dist/tools/smart-search.d.ts.map +1 -1
- package/ccw/dist/tools/smart-search.js +378 -75
- package/ccw/dist/tools/smart-search.js.map +1 -1
- package/ccw/dist/types/cli-settings.d.ts +86 -0
- package/ccw/dist/types/cli-settings.d.ts.map +1 -0
- package/ccw/dist/types/cli-settings.js +54 -0
- package/ccw/dist/types/cli-settings.js.map +1 -0
- package/ccw/dist/types/litellm-api-config.d.ts +40 -1
- package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
- package/ccw/dist/utils/exec-constants.d.ts +25 -0
- package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
- package/ccw/dist/utils/exec-constants.js +25 -0
- package/ccw/dist/utils/exec-constants.js.map +1 -0
- package/ccw/dist/utils/path-resolver.d.ts +1 -0
- package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
- package/ccw/dist/utils/path-resolver.js +48 -3
- package/ccw/dist/utils/path-resolver.js.map +1 -1
- package/ccw/dist/utils/path-validator.d.ts.map +1 -1
- package/ccw/dist/utils/path-validator.js +25 -6
- package/ccw/dist/utils/path-validator.js.map +1 -1
- package/ccw/dist/utils/python-utils.d.ts.map +1 -1
- package/ccw/dist/utils/python-utils.js +27 -7
- package/ccw/dist/utils/python-utils.js.map +1 -1
- package/ccw/dist/utils/shell-escape.d.ts +8 -0
- package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
- package/ccw/dist/utils/shell-escape.js +24 -0
- package/ccw/dist/utils/shell-escape.js.map +1 -0
- package/ccw/dist/utils/uv-manager.d.ts +167 -0
- package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
- package/ccw/dist/utils/uv-manager.js +644 -0
- package/ccw/dist/utils/uv-manager.js.map +1 -0
- package/ccw/src/cli.ts +4 -1
- package/ccw/src/commands/cli.ts +132 -34
- package/ccw/src/commands/issue.ts +605 -91
- package/ccw/src/commands/serve.ts +15 -5
- package/ccw/src/commands/stop.ts +32 -5
- package/ccw/src/commands/tool.ts +17 -2
- package/ccw/src/commands/view.ts +13 -3
- package/ccw/src/config/cli-settings-manager.ts +460 -0
- package/ccw/src/config/litellm-api-config-manager.ts +392 -57
- package/ccw/src/core/auth/csrf-manager.ts +104 -0
- package/ccw/src/core/auth/csrf-middleware.ts +159 -0
- package/ccw/src/core/auth/middleware.ts +94 -0
- package/ccw/src/core/auth/token-manager.ts +219 -0
- package/ccw/src/core/cache-manager.ts +64 -52
- package/ccw/src/core/claude-freshness.ts +26 -6
- package/ccw/src/core/core-memory-store.ts +2 -1
- package/ccw/src/core/cors.ts +10 -0
- package/ccw/src/core/dashboard-generator-patch.ts +47 -48
- package/ccw/src/core/dashboard-generator.ts +797 -744
- package/ccw/src/core/data-aggregator.ts +667 -667
- package/ccw/src/core/lite-scanner.ts +156 -140
- package/ccw/src/core/routes/auth-routes.ts +98 -0
- package/ccw/src/core/routes/ccw-routes.ts +10 -20
- package/ccw/src/core/routes/claude-routes.ts +101 -51
- package/ccw/src/core/routes/cli-routes.ts +152 -55
- package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
- package/ccw/src/core/routes/codexlens/README.md +37 -0
- package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
- package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
- package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
- package/ccw/src/core/routes/codexlens/utils.ts +96 -0
- package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
- package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
- package/ccw/src/core/routes/discovery-routes.ts +1 -12
- package/ccw/src/core/routes/files-routes.ts +112 -40
- package/ccw/src/core/routes/graph-routes.ts +39 -46
- package/ccw/src/core/routes/help-routes.ts +2 -12
- package/ccw/src/core/routes/hooks-routes.ts +83 -44
- package/ccw/src/core/routes/issue-routes.ts +1 -12
- package/ccw/src/core/routes/litellm-api-routes.ts +574 -60
- package/ccw/src/core/routes/litellm-routes.ts +35 -27
- package/ccw/src/core/routes/mcp-routes.ts +157 -60
- package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
- package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
- package/ccw/src/core/routes/memory-routes.ts +76 -22
- package/ccw/src/core/routes/nav-status-routes.ts +231 -0
- package/ccw/src/core/routes/rules-routes.ts +600 -81
- package/ccw/src/core/routes/session-routes.ts +28 -22
- package/ccw/src/core/routes/skills-routes.ts +452 -132
- package/ccw/src/core/routes/status-routes.ts +1 -12
- package/ccw/src/core/routes/system-routes.ts +15 -22
- package/ccw/src/core/routes/types.ts +25 -0
- package/ccw/src/core/server.ts +657 -468
- package/ccw/src/core/services/api-key-tester.ts +160 -0
- package/ccw/src/core/services/health-check-service.ts +366 -0
- package/ccw/src/core/websocket.ts +20 -12
- package/ccw/src/templates/dashboard-css/01-base.css +109 -0
- package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
- package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
- package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
- package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
- package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
- package/ccw/src/templates/dashboard-js/api.js +5 -0
- package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
- package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
- package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
- package/ccw/src/templates/dashboard-js/i18n.js +4448 -3983
- package/ccw/src/templates/dashboard-js/main.js +71 -0
- package/ccw/src/templates/dashboard-js/services.js +289 -0
- package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
- package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
- package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6101 -1965
- package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
- package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
- package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
- package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
- package/ccw/src/templates/dashboard.html +6 -0
- package/ccw/src/tools/README.md +29 -0
- package/ccw/src/tools/claude-cli-tools.ts +640 -125
- package/ccw/src/tools/cli-config-manager.ts +102 -172
- package/ccw/src/tools/cli-executor-core.ts +1533 -0
- package/ccw/src/tools/cli-executor-state.ts +560 -0
- package/ccw/src/tools/cli-executor-utils.ts +349 -0
- package/ccw/src/tools/cli-executor.ts +3 -2309
- package/ccw/src/tools/cli-history-store.ts +2 -0
- package/ccw/src/tools/cli-output-converter.ts +1237 -0
- package/ccw/src/tools/cli-prompt-builder.ts +487 -0
- package/ccw/src/tools/codex-lens.ts +324 -59
- package/ccw/src/tools/detect-changed-modules.ts +24 -6
- package/ccw/src/tools/index.ts +2 -0
- package/ccw/src/tools/litellm-client.ts +10 -4
- package/ccw/src/tools/litellm-executor.ts +146 -114
- package/ccw/src/tools/native-session-discovery.ts +209 -1
- package/ccw/src/tools/session-manager.ts +88 -0
- package/ccw/src/tools/skill-context-loader.ts +213 -0
- package/ccw/src/tools/smart-search.ts +427 -76
- package/ccw/src/types/cli-settings.ts +137 -0
- package/ccw/src/types/litellm-api-config.ts +55 -1
- package/ccw/src/utils/exec-constants.ts +24 -0
- package/ccw/src/utils/path-resolver.ts +49 -3
- package/ccw/src/utils/path-validator.ts +28 -6
- package/ccw/src/utils/python-utils.ts +140 -121
- package/ccw/src/utils/shell-escape.ts +30 -0
- package/ccw/src/utils/uv-manager.ts +796 -0
- package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
- package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
- package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
- package/codex-lens/pyproject.toml +43 -0
- package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
- package/codex-lens/src/codexlens/cli/embedding_manager.py +777 -15
- package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
- package/codex-lens/src/codexlens/config.py +356 -12
- package/codex-lens/src/codexlens/entities.py +4 -1
- package/codex-lens/src/codexlens/env_config.py +304 -0
- package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
- package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
- package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
- package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/factory.py +139 -10
- package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
- package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
- package/codex-lens/src/codexlens/search/chain_search.py +1652 -8
- package/codex-lens/src/codexlens/search/enrichment.py +21 -0
- package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
- package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
- package/codex-lens/src/codexlens/search/ranking.py +397 -8
- package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
- package/codex-lens/src/codexlens/semantic/chunker.py +328 -23
- package/codex-lens/src/codexlens/semantic/factory.py +63 -3
- package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
- package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
- package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
- package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
- package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
- package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
- package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
- package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
- package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
- package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
- package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
- package/codex-lens/src/codexlens/storage/__init__.py +3 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
- package/codex-lens/src/codexlens/storage/index_tree.py +240 -25
- package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
- package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
- package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
- package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
- package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/events.py +82 -0
- package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
- package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
- package/codex-lens/src/codexlens/watcher/manager.py +255 -0
- package/package.json +4 -1
- package/.claude/commands/workflow/docs/analyze.md +0 -1467
- package/.claude/commands/workflow/docs/copyright.md +0 -1265
- package/.claude/skills/command-guide/SKILL.md +0 -388
- package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
- package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
- package/.claude/skills/command-guide/guides/examples.md +0 -537
- package/.claude/skills/command-guide/guides/getting-started.md +0 -242
- package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
- package/.claude/skills/command-guide/guides/index-structure.md +0 -326
- package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
- package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
- package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
- package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
- package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
- package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
- package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
- package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
- package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
- package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
- package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
- package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
- package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
- package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
- package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
- package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
- package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
- package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
- package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
- package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
- package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
- package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
- package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
- package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
- package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
- package/.claude/skills/command-guide/reference/commands/version.md +0 -254
- package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
- package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
- package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
- package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
- package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
- package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
- package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
- package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
- package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
- package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
- package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
- package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
- package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
- package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
- package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
- package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
- package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
- package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
- package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
- package/.claude/skills/command-guide/templates/issue-question.md +0 -141
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
"""Multi-type embedding backends for cascade retrieval.
|
|
2
|
+
|
|
3
|
+
This module provides embedding backends optimized for cascade retrieval:
|
|
4
|
+
1. BinaryEmbeddingBackend - Fast coarse filtering with binary vectors
|
|
5
|
+
2. DenseEmbeddingBackend - High-precision dense vectors for reranking
|
|
6
|
+
3. CascadeEmbeddingBackend - Combined binary + dense for two-stage retrieval
|
|
7
|
+
|
|
8
|
+
Cascade retrieval workflow:
|
|
9
|
+
1. Binary search (fast, ~32 bytes/vector) -> top-K candidates
|
|
10
|
+
2. Dense rerank (precise, ~8KB/vector) -> final results
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
from typing import Iterable, List, Optional, Tuple
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
|
|
20
|
+
from codexlens.semantic.base import BaseEmbedder
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# =============================================================================
|
|
26
|
+
# Utility Functions
|
|
27
|
+
# =============================================================================
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def binarize_embedding(embedding: np.ndarray) -> np.ndarray:
|
|
31
|
+
"""Convert float embedding to binary vector.
|
|
32
|
+
|
|
33
|
+
Applies sign-based quantization: values > 0 become 1, values <= 0 become 0.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
embedding: Float32 embedding of any dimension
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Binary vector (uint8 with values 0 or 1) of same dimension
|
|
40
|
+
"""
|
|
41
|
+
return (embedding > 0).astype(np.uint8)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def pack_binary_embedding(binary_vector: np.ndarray) -> bytes:
|
|
45
|
+
"""Pack binary vector into compact bytes format.
|
|
46
|
+
|
|
47
|
+
Packs 8 binary values into each byte for storage efficiency.
|
|
48
|
+
For a 256-dim binary vector, output is 32 bytes.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
binary_vector: Binary vector (uint8 with values 0 or 1)
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Packed bytes (length = ceil(dim / 8))
|
|
55
|
+
"""
|
|
56
|
+
# Ensure vector length is multiple of 8 by padding if needed
|
|
57
|
+
dim = len(binary_vector)
|
|
58
|
+
padded_dim = ((dim + 7) // 8) * 8
|
|
59
|
+
if padded_dim > dim:
|
|
60
|
+
padded = np.zeros(padded_dim, dtype=np.uint8)
|
|
61
|
+
padded[:dim] = binary_vector
|
|
62
|
+
binary_vector = padded
|
|
63
|
+
|
|
64
|
+
# Pack 8 bits per byte
|
|
65
|
+
packed = np.packbits(binary_vector)
|
|
66
|
+
return packed.tobytes()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def unpack_binary_embedding(packed_bytes: bytes, dim: int = 256) -> np.ndarray:
|
|
70
|
+
"""Unpack bytes back to binary vector.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
packed_bytes: Packed binary data
|
|
74
|
+
dim: Original vector dimension (default: 256)
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Binary vector (uint8 with values 0 or 1)
|
|
78
|
+
"""
|
|
79
|
+
unpacked = np.unpackbits(np.frombuffer(packed_bytes, dtype=np.uint8))
|
|
80
|
+
return unpacked[:dim]
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def hamming_distance(a: bytes, b: bytes) -> int:
|
|
84
|
+
"""Compute Hamming distance between two packed binary vectors.
|
|
85
|
+
|
|
86
|
+
Uses XOR and popcount for efficient distance computation.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
a: First packed binary vector
|
|
90
|
+
b: Second packed binary vector
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Hamming distance (number of differing bits)
|
|
94
|
+
"""
|
|
95
|
+
a_arr = np.frombuffer(a, dtype=np.uint8)
|
|
96
|
+
b_arr = np.frombuffer(b, dtype=np.uint8)
|
|
97
|
+
xor = np.bitwise_xor(a_arr, b_arr)
|
|
98
|
+
return int(np.unpackbits(xor).sum())
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# =============================================================================
|
|
102
|
+
# Binary Embedding Backend
|
|
103
|
+
# =============================================================================
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class BinaryEmbeddingBackend(BaseEmbedder):
|
|
107
|
+
"""Generate 256-dimensional binary embeddings for fast coarse retrieval.
|
|
108
|
+
|
|
109
|
+
Uses a lightweight embedding model and applies sign-based quantization
|
|
110
|
+
to produce compact binary vectors (32 bytes per embedding).
|
|
111
|
+
|
|
112
|
+
Suitable for:
|
|
113
|
+
- First-stage candidate retrieval
|
|
114
|
+
- Hamming distance-based similarity search
|
|
115
|
+
- Memory-constrained environments
|
|
116
|
+
|
|
117
|
+
Model: sentence-transformers/all-MiniLM-L6-v2 (384 dim) -> quantized to 256 bits
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
DEFAULT_MODEL = "BAAI/bge-small-en-v1.5" # 384 dim, fast
|
|
121
|
+
BINARY_DIM = 256
|
|
122
|
+
|
|
123
|
+
def __init__(
|
|
124
|
+
self,
|
|
125
|
+
model_name: Optional[str] = None,
|
|
126
|
+
use_gpu: bool = True,
|
|
127
|
+
) -> None:
|
|
128
|
+
"""Initialize binary embedding backend.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
model_name: Base embedding model name. Defaults to BAAI/bge-small-en-v1.5
|
|
132
|
+
use_gpu: Whether to use GPU acceleration
|
|
133
|
+
"""
|
|
134
|
+
from codexlens.semantic import SEMANTIC_AVAILABLE
|
|
135
|
+
|
|
136
|
+
if not SEMANTIC_AVAILABLE:
|
|
137
|
+
raise ImportError(
|
|
138
|
+
"Semantic search dependencies not available. "
|
|
139
|
+
"Install with: pip install codexlens[semantic]"
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
self._model_name = model_name or self.DEFAULT_MODEL
|
|
143
|
+
self._use_gpu = use_gpu
|
|
144
|
+
self._model = None
|
|
145
|
+
|
|
146
|
+
# Projection matrix for dimension reduction (lazily initialized)
|
|
147
|
+
self._projection_matrix: Optional[np.ndarray] = None
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def model_name(self) -> str:
|
|
151
|
+
"""Return model name."""
|
|
152
|
+
return self._model_name
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def embedding_dim(self) -> int:
|
|
156
|
+
"""Return binary embedding dimension (256)."""
|
|
157
|
+
return self.BINARY_DIM
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def packed_bytes(self) -> int:
|
|
161
|
+
"""Return packed bytes size (32 bytes for 256 bits)."""
|
|
162
|
+
return self.BINARY_DIM // 8
|
|
163
|
+
|
|
164
|
+
def _load_model(self) -> None:
|
|
165
|
+
"""Lazy load the embedding model."""
|
|
166
|
+
if self._model is not None:
|
|
167
|
+
return
|
|
168
|
+
|
|
169
|
+
from fastembed import TextEmbedding
|
|
170
|
+
from codexlens.semantic.gpu_support import get_optimal_providers
|
|
171
|
+
|
|
172
|
+
providers = get_optimal_providers(use_gpu=self._use_gpu, with_device_options=True)
|
|
173
|
+
try:
|
|
174
|
+
self._model = TextEmbedding(
|
|
175
|
+
model_name=self._model_name,
|
|
176
|
+
providers=providers,
|
|
177
|
+
)
|
|
178
|
+
except TypeError:
|
|
179
|
+
# Fallback for older fastembed versions
|
|
180
|
+
self._model = TextEmbedding(model_name=self._model_name)
|
|
181
|
+
|
|
182
|
+
logger.debug(f"BinaryEmbeddingBackend loaded model: {self._model_name}")
|
|
183
|
+
|
|
184
|
+
def _get_projection_matrix(self, input_dim: int) -> np.ndarray:
|
|
185
|
+
"""Get or create projection matrix for dimension reduction.
|
|
186
|
+
|
|
187
|
+
Uses random projection with fixed seed for reproducibility.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
input_dim: Input embedding dimension from base model
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
Projection matrix of shape (input_dim, BINARY_DIM)
|
|
194
|
+
"""
|
|
195
|
+
if self._projection_matrix is not None:
|
|
196
|
+
return self._projection_matrix
|
|
197
|
+
|
|
198
|
+
# Fixed seed for reproducibility across sessions
|
|
199
|
+
rng = np.random.RandomState(42)
|
|
200
|
+
# Gaussian random projection
|
|
201
|
+
self._projection_matrix = rng.randn(input_dim, self.BINARY_DIM).astype(np.float32)
|
|
202
|
+
# Normalize columns for consistent scale
|
|
203
|
+
norms = np.linalg.norm(self._projection_matrix, axis=0, keepdims=True)
|
|
204
|
+
self._projection_matrix /= (norms + 1e-8)
|
|
205
|
+
|
|
206
|
+
return self._projection_matrix
|
|
207
|
+
|
|
208
|
+
def embed_to_numpy(self, texts: str | Iterable[str]) -> np.ndarray:
|
|
209
|
+
"""Generate binary embeddings as numpy array.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
texts: Single text or iterable of texts
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
Binary embeddings of shape (n_texts, 256) with values 0 or 1
|
|
216
|
+
"""
|
|
217
|
+
self._load_model()
|
|
218
|
+
|
|
219
|
+
if isinstance(texts, str):
|
|
220
|
+
texts = [texts]
|
|
221
|
+
else:
|
|
222
|
+
texts = list(texts)
|
|
223
|
+
|
|
224
|
+
# Get base float embeddings
|
|
225
|
+
float_embeddings = np.array(list(self._model.embed(texts)))
|
|
226
|
+
input_dim = float_embeddings.shape[1]
|
|
227
|
+
|
|
228
|
+
# Project to target dimension if needed
|
|
229
|
+
if input_dim != self.BINARY_DIM:
|
|
230
|
+
projection = self._get_projection_matrix(input_dim)
|
|
231
|
+
float_embeddings = float_embeddings @ projection
|
|
232
|
+
|
|
233
|
+
# Binarize
|
|
234
|
+
return binarize_embedding(float_embeddings)
|
|
235
|
+
|
|
236
|
+
def embed_packed(self, texts: str | Iterable[str]) -> List[bytes]:
|
|
237
|
+
"""Generate packed binary embeddings.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
texts: Single text or iterable of texts
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
List of packed bytes (32 bytes each for 256-dim)
|
|
244
|
+
"""
|
|
245
|
+
binary = self.embed_to_numpy(texts)
|
|
246
|
+
return [pack_binary_embedding(vec) for vec in binary]
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
# =============================================================================
|
|
250
|
+
# Dense Embedding Backend
|
|
251
|
+
# =============================================================================
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
class DenseEmbeddingBackend(BaseEmbedder):
|
|
255
|
+
"""Generate high-dimensional dense embeddings for precise reranking.
|
|
256
|
+
|
|
257
|
+
Uses large embedding models to produce 2048-dimensional float32 vectors
|
|
258
|
+
for maximum retrieval quality.
|
|
259
|
+
|
|
260
|
+
Suitable for:
|
|
261
|
+
- Second-stage reranking
|
|
262
|
+
- High-precision similarity search
|
|
263
|
+
- Quality-critical applications
|
|
264
|
+
|
|
265
|
+
Model: BAAI/bge-large-en-v1.5 (1024 dim) with optional expansion
|
|
266
|
+
"""
|
|
267
|
+
|
|
268
|
+
DEFAULT_MODEL = "BAAI/bge-small-en-v1.5" # 384 dim, use small for testing
|
|
269
|
+
TARGET_DIM = 768 # Reduced target for faster testing
|
|
270
|
+
|
|
271
|
+
def __init__(
|
|
272
|
+
self,
|
|
273
|
+
model_name: Optional[str] = None,
|
|
274
|
+
use_gpu: bool = True,
|
|
275
|
+
expand_dim: bool = True,
|
|
276
|
+
) -> None:
|
|
277
|
+
"""Initialize dense embedding backend.
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
model_name: Dense embedding model name. Defaults to BAAI/bge-large-en-v1.5
|
|
281
|
+
use_gpu: Whether to use GPU acceleration
|
|
282
|
+
expand_dim: If True, expand embeddings to TARGET_DIM using learned expansion
|
|
283
|
+
"""
|
|
284
|
+
from codexlens.semantic import SEMANTIC_AVAILABLE
|
|
285
|
+
|
|
286
|
+
if not SEMANTIC_AVAILABLE:
|
|
287
|
+
raise ImportError(
|
|
288
|
+
"Semantic search dependencies not available. "
|
|
289
|
+
"Install with: pip install codexlens[semantic]"
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
self._model_name = model_name or self.DEFAULT_MODEL
|
|
293
|
+
self._use_gpu = use_gpu
|
|
294
|
+
self._expand_dim = expand_dim
|
|
295
|
+
self._model = None
|
|
296
|
+
self._native_dim: Optional[int] = None
|
|
297
|
+
|
|
298
|
+
# Expansion matrix for dimension expansion (lazily initialized)
|
|
299
|
+
self._expansion_matrix: Optional[np.ndarray] = None
|
|
300
|
+
|
|
301
|
+
@property
|
|
302
|
+
def model_name(self) -> str:
|
|
303
|
+
"""Return model name."""
|
|
304
|
+
return self._model_name
|
|
305
|
+
|
|
306
|
+
@property
|
|
307
|
+
def embedding_dim(self) -> int:
|
|
308
|
+
"""Return embedding dimension.
|
|
309
|
+
|
|
310
|
+
Returns TARGET_DIM if expand_dim is True, otherwise native model dimension.
|
|
311
|
+
"""
|
|
312
|
+
if self._expand_dim:
|
|
313
|
+
return self.TARGET_DIM
|
|
314
|
+
# Return cached native dim or estimate based on model
|
|
315
|
+
if self._native_dim is not None:
|
|
316
|
+
return self._native_dim
|
|
317
|
+
# Model dimension estimates
|
|
318
|
+
model_dims = {
|
|
319
|
+
"BAAI/bge-large-en-v1.5": 1024,
|
|
320
|
+
"BAAI/bge-base-en-v1.5": 768,
|
|
321
|
+
"BAAI/bge-small-en-v1.5": 384,
|
|
322
|
+
"intfloat/multilingual-e5-large": 1024,
|
|
323
|
+
}
|
|
324
|
+
return model_dims.get(self._model_name, 1024)
|
|
325
|
+
|
|
326
|
+
@property
|
|
327
|
+
def max_tokens(self) -> int:
|
|
328
|
+
"""Return maximum token limit."""
|
|
329
|
+
return 512 # Conservative default for large models
|
|
330
|
+
|
|
331
|
+
def _load_model(self) -> None:
|
|
332
|
+
"""Lazy load the embedding model."""
|
|
333
|
+
if self._model is not None:
|
|
334
|
+
return
|
|
335
|
+
|
|
336
|
+
from fastembed import TextEmbedding
|
|
337
|
+
from codexlens.semantic.gpu_support import get_optimal_providers
|
|
338
|
+
|
|
339
|
+
providers = get_optimal_providers(use_gpu=self._use_gpu, with_device_options=True)
|
|
340
|
+
try:
|
|
341
|
+
self._model = TextEmbedding(
|
|
342
|
+
model_name=self._model_name,
|
|
343
|
+
providers=providers,
|
|
344
|
+
)
|
|
345
|
+
except TypeError:
|
|
346
|
+
self._model = TextEmbedding(model_name=self._model_name)
|
|
347
|
+
|
|
348
|
+
logger.debug(f"DenseEmbeddingBackend loaded model: {self._model_name}")
|
|
349
|
+
|
|
350
|
+
def _get_expansion_matrix(self, input_dim: int) -> np.ndarray:
|
|
351
|
+
"""Get or create expansion matrix for dimension expansion.
|
|
352
|
+
|
|
353
|
+
Uses random orthogonal projection for information-preserving expansion.
|
|
354
|
+
|
|
355
|
+
Args:
|
|
356
|
+
input_dim: Input embedding dimension from base model
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
Expansion matrix of shape (input_dim, TARGET_DIM)
|
|
360
|
+
"""
|
|
361
|
+
if self._expansion_matrix is not None:
|
|
362
|
+
return self._expansion_matrix
|
|
363
|
+
|
|
364
|
+
# Fixed seed for reproducibility
|
|
365
|
+
rng = np.random.RandomState(123)
|
|
366
|
+
|
|
367
|
+
# Create semi-orthogonal expansion matrix
|
|
368
|
+
# First input_dim columns form identity-like structure
|
|
369
|
+
self._expansion_matrix = np.zeros((input_dim, self.TARGET_DIM), dtype=np.float32)
|
|
370
|
+
|
|
371
|
+
# Copy original dimensions
|
|
372
|
+
copy_dim = min(input_dim, self.TARGET_DIM)
|
|
373
|
+
self._expansion_matrix[:copy_dim, :copy_dim] = np.eye(copy_dim, dtype=np.float32)
|
|
374
|
+
|
|
375
|
+
# Fill remaining with random projections
|
|
376
|
+
if self.TARGET_DIM > input_dim:
|
|
377
|
+
random_part = rng.randn(input_dim, self.TARGET_DIM - input_dim).astype(np.float32)
|
|
378
|
+
# Normalize
|
|
379
|
+
norms = np.linalg.norm(random_part, axis=0, keepdims=True)
|
|
380
|
+
random_part /= (norms + 1e-8)
|
|
381
|
+
self._expansion_matrix[:, input_dim:] = random_part
|
|
382
|
+
|
|
383
|
+
return self._expansion_matrix
|
|
384
|
+
|
|
385
|
+
def embed_to_numpy(self, texts: str | Iterable[str]) -> np.ndarray:
|
|
386
|
+
"""Generate dense embeddings as numpy array.
|
|
387
|
+
|
|
388
|
+
Args:
|
|
389
|
+
texts: Single text or iterable of texts
|
|
390
|
+
|
|
391
|
+
Returns:
|
|
392
|
+
Dense embeddings of shape (n_texts, TARGET_DIM) as float32
|
|
393
|
+
"""
|
|
394
|
+
self._load_model()
|
|
395
|
+
|
|
396
|
+
if isinstance(texts, str):
|
|
397
|
+
texts = [texts]
|
|
398
|
+
else:
|
|
399
|
+
texts = list(texts)
|
|
400
|
+
|
|
401
|
+
# Get base float embeddings
|
|
402
|
+
float_embeddings = np.array(list(self._model.embed(texts)), dtype=np.float32)
|
|
403
|
+
self._native_dim = float_embeddings.shape[1]
|
|
404
|
+
|
|
405
|
+
# Expand to target dimension if needed
|
|
406
|
+
if self._expand_dim and self._native_dim < self.TARGET_DIM:
|
|
407
|
+
expansion = self._get_expansion_matrix(self._native_dim)
|
|
408
|
+
float_embeddings = float_embeddings @ expansion
|
|
409
|
+
|
|
410
|
+
return float_embeddings
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
# =============================================================================
|
|
414
|
+
# Cascade Embedding Backend
|
|
415
|
+
# =============================================================================
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
class CascadeEmbeddingBackend(BaseEmbedder):
|
|
419
|
+
"""Combined binary + dense embedding backend for cascade retrieval.
|
|
420
|
+
|
|
421
|
+
Generates both binary (for fast coarse filtering) and dense (for precise
|
|
422
|
+
reranking) embeddings in a single pass, optimized for two-stage retrieval.
|
|
423
|
+
|
|
424
|
+
Cascade workflow:
|
|
425
|
+
1. encode_cascade() returns (binary_embeddings, dense_embeddings)
|
|
426
|
+
2. Binary search: Use Hamming distance on binary vectors -> top-K candidates
|
|
427
|
+
3. Dense rerank: Use cosine similarity on dense vectors -> final results
|
|
428
|
+
|
|
429
|
+
Memory efficiency:
|
|
430
|
+
- Binary: 32 bytes per vector (256 bits)
|
|
431
|
+
- Dense: 8192 bytes per vector (2048 x float32)
|
|
432
|
+
- Total: ~8KB per document for full cascade support
|
|
433
|
+
"""
|
|
434
|
+
|
|
435
|
+
def __init__(
|
|
436
|
+
self,
|
|
437
|
+
binary_model: Optional[str] = None,
|
|
438
|
+
dense_model: Optional[str] = None,
|
|
439
|
+
use_gpu: bool = True,
|
|
440
|
+
) -> None:
|
|
441
|
+
"""Initialize cascade embedding backend.
|
|
442
|
+
|
|
443
|
+
Args:
|
|
444
|
+
binary_model: Model for binary embeddings. Defaults to BAAI/bge-small-en-v1.5
|
|
445
|
+
dense_model: Model for dense embeddings. Defaults to BAAI/bge-large-en-v1.5
|
|
446
|
+
use_gpu: Whether to use GPU acceleration
|
|
447
|
+
"""
|
|
448
|
+
self._binary_backend = BinaryEmbeddingBackend(
|
|
449
|
+
model_name=binary_model,
|
|
450
|
+
use_gpu=use_gpu,
|
|
451
|
+
)
|
|
452
|
+
self._dense_backend = DenseEmbeddingBackend(
|
|
453
|
+
model_name=dense_model,
|
|
454
|
+
use_gpu=use_gpu,
|
|
455
|
+
expand_dim=True,
|
|
456
|
+
)
|
|
457
|
+
self._use_gpu = use_gpu
|
|
458
|
+
|
|
459
|
+
@property
|
|
460
|
+
def model_name(self) -> str:
|
|
461
|
+
"""Return model names for both backends."""
|
|
462
|
+
return f"cascade({self._binary_backend.model_name}, {self._dense_backend.model_name})"
|
|
463
|
+
|
|
464
|
+
@property
|
|
465
|
+
def embedding_dim(self) -> int:
|
|
466
|
+
"""Return dense embedding dimension (for compatibility)."""
|
|
467
|
+
return self._dense_backend.embedding_dim
|
|
468
|
+
|
|
469
|
+
@property
|
|
470
|
+
def binary_dim(self) -> int:
|
|
471
|
+
"""Return binary embedding dimension."""
|
|
472
|
+
return self._binary_backend.embedding_dim
|
|
473
|
+
|
|
474
|
+
@property
|
|
475
|
+
def dense_dim(self) -> int:
|
|
476
|
+
"""Return dense embedding dimension."""
|
|
477
|
+
return self._dense_backend.embedding_dim
|
|
478
|
+
|
|
479
|
+
def embed_to_numpy(self, texts: str | Iterable[str]) -> np.ndarray:
|
|
480
|
+
"""Generate dense embeddings (for BaseEmbedder compatibility).
|
|
481
|
+
|
|
482
|
+
For cascade embeddings, use encode_cascade() instead.
|
|
483
|
+
|
|
484
|
+
Args:
|
|
485
|
+
texts: Single text or iterable of texts
|
|
486
|
+
|
|
487
|
+
Returns:
|
|
488
|
+
Dense embeddings of shape (n_texts, dense_dim)
|
|
489
|
+
"""
|
|
490
|
+
return self._dense_backend.embed_to_numpy(texts)
|
|
491
|
+
|
|
492
|
+
def encode_cascade(
|
|
493
|
+
self,
|
|
494
|
+
texts: str | Iterable[str],
|
|
495
|
+
batch_size: int = 32,
|
|
496
|
+
) -> Tuple[np.ndarray, np.ndarray]:
|
|
497
|
+
"""Generate both binary and dense embeddings.
|
|
498
|
+
|
|
499
|
+
Args:
|
|
500
|
+
texts: Single text or iterable of texts
|
|
501
|
+
batch_size: Batch size for processing
|
|
502
|
+
|
|
503
|
+
Returns:
|
|
504
|
+
Tuple of:
|
|
505
|
+
- binary_embeddings: Shape (n_texts, 256), uint8 values 0/1
|
|
506
|
+
- dense_embeddings: Shape (n_texts, 2048), float32
|
|
507
|
+
"""
|
|
508
|
+
if isinstance(texts, str):
|
|
509
|
+
texts = [texts]
|
|
510
|
+
else:
|
|
511
|
+
texts = list(texts)
|
|
512
|
+
|
|
513
|
+
binary_embeddings = self._binary_backend.embed_to_numpy(texts)
|
|
514
|
+
dense_embeddings = self._dense_backend.embed_to_numpy(texts)
|
|
515
|
+
|
|
516
|
+
return binary_embeddings, dense_embeddings
|
|
517
|
+
|
|
518
|
+
def encode_binary(self, texts: str | Iterable[str]) -> np.ndarray:
|
|
519
|
+
"""Generate only binary embeddings.
|
|
520
|
+
|
|
521
|
+
Args:
|
|
522
|
+
texts: Single text or iterable of texts
|
|
523
|
+
|
|
524
|
+
Returns:
|
|
525
|
+
Binary embeddings of shape (n_texts, 256)
|
|
526
|
+
"""
|
|
527
|
+
return self._binary_backend.embed_to_numpy(texts)
|
|
528
|
+
|
|
529
|
+
def encode_dense(self, texts: str | Iterable[str]) -> np.ndarray:
|
|
530
|
+
"""Generate only dense embeddings.
|
|
531
|
+
|
|
532
|
+
Args:
|
|
533
|
+
texts: Single text or iterable of texts
|
|
534
|
+
|
|
535
|
+
Returns:
|
|
536
|
+
Dense embeddings of shape (n_texts, 2048)
|
|
537
|
+
"""
|
|
538
|
+
return self._dense_backend.embed_to_numpy(texts)
|
|
539
|
+
|
|
540
|
+
def encode_binary_packed(self, texts: str | Iterable[str]) -> List[bytes]:
|
|
541
|
+
"""Generate packed binary embeddings.
|
|
542
|
+
|
|
543
|
+
Args:
|
|
544
|
+
texts: Single text or iterable of texts
|
|
545
|
+
|
|
546
|
+
Returns:
|
|
547
|
+
List of packed bytes (32 bytes each)
|
|
548
|
+
"""
|
|
549
|
+
return self._binary_backend.embed_packed(texts)
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
# =============================================================================
|
|
553
|
+
# Factory Function
|
|
554
|
+
# =============================================================================
|
|
555
|
+
|
|
556
|
+
|
|
557
|
+
def get_cascade_embedder(
|
|
558
|
+
binary_model: Optional[str] = None,
|
|
559
|
+
dense_model: Optional[str] = None,
|
|
560
|
+
use_gpu: bool = True,
|
|
561
|
+
) -> CascadeEmbeddingBackend:
|
|
562
|
+
"""Factory function to create a cascade embedder.
|
|
563
|
+
|
|
564
|
+
Args:
|
|
565
|
+
binary_model: Model for binary embeddings (default: BAAI/bge-small-en-v1.5)
|
|
566
|
+
dense_model: Model for dense embeddings (default: BAAI/bge-large-en-v1.5)
|
|
567
|
+
use_gpu: Whether to use GPU acceleration
|
|
568
|
+
|
|
569
|
+
Returns:
|
|
570
|
+
Configured CascadeEmbeddingBackend instance
|
|
571
|
+
|
|
572
|
+
Example:
|
|
573
|
+
>>> embedder = get_cascade_embedder()
|
|
574
|
+
>>> binary, dense = embedder.encode_cascade(["hello world"])
|
|
575
|
+
>>> binary.shape # (1, 256)
|
|
576
|
+
>>> dense.shape # (1, 2048)
|
|
577
|
+
"""
|
|
578
|
+
return CascadeEmbeddingBackend(
|
|
579
|
+
binary_model=binary_model,
|
|
580
|
+
dense_model=dense_model,
|
|
581
|
+
use_gpu=use_gpu,
|
|
582
|
+
)
|
|
@@ -4,6 +4,11 @@ import sqlite3
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import Any, Dict, List, Optional, Tuple
|
|
6
6
|
|
|
7
|
+
try:
|
|
8
|
+
from codexlens.parsers.treesitter_parser import TreeSitterSymbolParser
|
|
9
|
+
except Exception: # pragma: no cover - optional dependency / platform variance
|
|
10
|
+
TreeSitterSymbolParser = None # type: ignore[assignment]
|
|
11
|
+
|
|
7
12
|
|
|
8
13
|
class SymbolExtractor:
|
|
9
14
|
"""Extract symbols and relationships from source code using regex patterns."""
|
|
@@ -118,7 +123,7 @@ class SymbolExtractor:
|
|
|
118
123
|
|
|
119
124
|
patterns = self.PATTERNS[lang]
|
|
120
125
|
symbols = []
|
|
121
|
-
relationships = []
|
|
126
|
+
relationships: List[Dict] = []
|
|
122
127
|
lines = content.split('\n')
|
|
123
128
|
|
|
124
129
|
current_scope = None
|
|
@@ -141,33 +146,62 @@ class SymbolExtractor:
|
|
|
141
146
|
})
|
|
142
147
|
current_scope = name
|
|
143
148
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if
|
|
148
|
-
|
|
149
|
-
if
|
|
150
|
-
relationships
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
149
|
+
if TreeSitterSymbolParser is not None:
|
|
150
|
+
try:
|
|
151
|
+
ts_parser = TreeSitterSymbolParser(lang, file_path)
|
|
152
|
+
if ts_parser.is_available():
|
|
153
|
+
indexed = ts_parser.parse(content, file_path)
|
|
154
|
+
if indexed is not None and indexed.relationships:
|
|
155
|
+
relationships = [
|
|
156
|
+
{
|
|
157
|
+
"source_scope": r.source_symbol,
|
|
158
|
+
"target": r.target_symbol,
|
|
159
|
+
"type": r.relationship_type.value,
|
|
160
|
+
"file_path": str(file_path),
|
|
161
|
+
"line": r.source_line,
|
|
162
|
+
}
|
|
163
|
+
for r in indexed.relationships
|
|
164
|
+
]
|
|
165
|
+
except Exception:
|
|
166
|
+
relationships = []
|
|
167
|
+
|
|
168
|
+
# Regex fallback for relationships (when tree-sitter is unavailable)
|
|
169
|
+
if not relationships:
|
|
170
|
+
current_scope = None
|
|
171
|
+
for line_num, line in enumerate(lines, 1):
|
|
172
|
+
for kind in ['function', 'class']:
|
|
173
|
+
if kind in patterns:
|
|
174
|
+
match = re.search(patterns[kind], line)
|
|
175
|
+
if match:
|
|
176
|
+
current_scope = match.group(1)
|
|
177
|
+
|
|
178
|
+
# Extract imports
|
|
179
|
+
if 'import' in patterns:
|
|
180
|
+
match = re.search(patterns['import'], line)
|
|
181
|
+
if match:
|
|
182
|
+
import_target = match.group(1) or match.group(2) if match.lastindex >= 2 else match.group(1)
|
|
183
|
+
if import_target and current_scope:
|
|
184
|
+
relationships.append({
|
|
185
|
+
'source_scope': current_scope,
|
|
186
|
+
'target': import_target.strip(),
|
|
187
|
+
'type': 'imports',
|
|
188
|
+
'file_path': str(file_path),
|
|
189
|
+
'line': line_num,
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
# Extract function calls (simplified)
|
|
193
|
+
if 'call' in patterns and current_scope:
|
|
194
|
+
for match in re.finditer(patterns['call'], line):
|
|
195
|
+
call_name = match.group(1)
|
|
196
|
+
# Skip common keywords and the current function
|
|
197
|
+
if call_name not in ['if', 'for', 'while', 'return', 'print', 'len', 'str', 'int', 'float', 'list', 'dict', 'set', 'tuple', current_scope]:
|
|
198
|
+
relationships.append({
|
|
199
|
+
'source_scope': current_scope,
|
|
200
|
+
'target': call_name,
|
|
201
|
+
'type': 'calls',
|
|
202
|
+
'file_path': str(file_path),
|
|
203
|
+
'line': line_num,
|
|
204
|
+
})
|
|
171
205
|
|
|
172
206
|
return symbols, relationships
|
|
173
207
|
|