claude-code-workflow 6.3.18 → 6.3.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 +1 -1
- package/.claude/commands/issue/plan.md +6 -1
- 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 +305 -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 +505 -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 +201 -29
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
- package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
- package/ccw/dist/core/services/api-key-tester.js +106 -0
- package/ccw/dist/core/services/api-key-tester.js.map +1 -0
- package/ccw/dist/core/services/health-check-service.d.ts +82 -0
- package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
- package/ccw/dist/core/services/health-check-service.js +271 -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 +566 -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 +651 -468
- package/ccw/src/core/services/api-key-tester.ts +137 -0
- package/ccw/src/core/services/health-check-service.ts +340 -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 +4438 -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 +6091 -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 +767 -14
- package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
- package/codex-lens/src/codexlens/config.py +321 -12
- package/codex-lens/src/codexlens/entities.py +4 -1
- package/codex-lens/src/codexlens/env_config.py +298 -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 +1642 -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 +347 -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__/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/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-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-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-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-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-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-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-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 +194 -23
- 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
|
@@ -9,6 +9,7 @@ Key features:
|
|
|
9
9
|
- Incremental vector addition and deletion
|
|
10
10
|
- Thread-safe operations
|
|
11
11
|
- Cosine similarity metric
|
|
12
|
+
- Support for centralized storage mode (single index at project root)
|
|
12
13
|
"""
|
|
13
14
|
|
|
14
15
|
from __future__ import annotations
|
|
@@ -19,6 +20,7 @@ from pathlib import Path
|
|
|
19
20
|
from typing import List, Optional, Tuple
|
|
20
21
|
|
|
21
22
|
from codexlens.errors import StorageError
|
|
23
|
+
from codexlens.config import VECTORS_HNSW_NAME
|
|
22
24
|
|
|
23
25
|
from . import SEMANTIC_AVAILABLE
|
|
24
26
|
|
|
@@ -127,6 +129,94 @@ class ANNIndex:
|
|
|
127
129
|
f"auto_save={auto_save}, expansion_threshold={expansion_threshold}"
|
|
128
130
|
)
|
|
129
131
|
|
|
132
|
+
@classmethod
|
|
133
|
+
def create_central(
|
|
134
|
+
cls,
|
|
135
|
+
index_root: Path,
|
|
136
|
+
dim: int,
|
|
137
|
+
initial_capacity: int = 50000,
|
|
138
|
+
auto_save: bool = False,
|
|
139
|
+
expansion_threshold: float = 0.8,
|
|
140
|
+
) -> "ANNIndex":
|
|
141
|
+
"""Create a centralized ANN index at the project index root.
|
|
142
|
+
|
|
143
|
+
This method creates a single shared HNSW index file at the project root,
|
|
144
|
+
rather than per-directory indexes. Use this for projects that want all
|
|
145
|
+
dense vectors stored in one central location.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
index_root: Root directory for the index (e.g., .codexlens/<project_hash>/)
|
|
149
|
+
dim: Dimension of embedding vectors
|
|
150
|
+
initial_capacity: Initial maximum elements capacity (default: 50000)
|
|
151
|
+
auto_save: Whether to automatically save index after operations (default: False)
|
|
152
|
+
expansion_threshold: Capacity threshold to trigger auto-expansion (default: 0.8)
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
ANNIndex instance configured for centralized storage
|
|
156
|
+
|
|
157
|
+
Example:
|
|
158
|
+
>>> index = ANNIndex.create_central(Path(".codexlens/abc123"), dim=768)
|
|
159
|
+
>>> index.hnsw_path # Returns: .codexlens/abc123/_vectors.hnsw
|
|
160
|
+
"""
|
|
161
|
+
# Create a dummy index_path that will result in the central hnsw_path
|
|
162
|
+
# The index_path is used to derive hnsw_path, so we create a virtual path
|
|
163
|
+
# such that self.hnsw_path = index_root / VECTORS_HNSW_NAME
|
|
164
|
+
instance = cls.__new__(cls)
|
|
165
|
+
|
|
166
|
+
if not SEMANTIC_AVAILABLE:
|
|
167
|
+
raise ImportError(
|
|
168
|
+
"Semantic search dependencies not available. "
|
|
169
|
+
"Install with: pip install codexlens[semantic]"
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
if not HNSWLIB_AVAILABLE:
|
|
173
|
+
raise ImportError(
|
|
174
|
+
"hnswlib is required for ANN index. "
|
|
175
|
+
"Install with: pip install hnswlib"
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
if dim <= 0:
|
|
179
|
+
raise ValueError(f"Invalid dimension: {dim}")
|
|
180
|
+
|
|
181
|
+
if initial_capacity <= 0:
|
|
182
|
+
raise ValueError(f"Invalid initial capacity: {initial_capacity}")
|
|
183
|
+
|
|
184
|
+
if not 0.0 < expansion_threshold < 1.0:
|
|
185
|
+
raise ValueError(
|
|
186
|
+
f"Invalid expansion threshold: {expansion_threshold}. Must be between 0 and 1."
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
instance.index_path = index_root
|
|
190
|
+
instance.dim = dim
|
|
191
|
+
|
|
192
|
+
# Centralized mode: use VECTORS_HNSW_NAME directly at index_root
|
|
193
|
+
instance.hnsw_path = index_root / VECTORS_HNSW_NAME
|
|
194
|
+
|
|
195
|
+
# HNSW parameters
|
|
196
|
+
instance.space = "cosine"
|
|
197
|
+
instance.M = 16
|
|
198
|
+
instance.ef_construction = 200
|
|
199
|
+
instance.ef = 50
|
|
200
|
+
|
|
201
|
+
# Memory management parameters
|
|
202
|
+
instance._auto_save = auto_save
|
|
203
|
+
instance._expansion_threshold = expansion_threshold
|
|
204
|
+
|
|
205
|
+
# Thread safety
|
|
206
|
+
instance._lock = threading.RLock()
|
|
207
|
+
|
|
208
|
+
# HNSW index instance
|
|
209
|
+
instance._index: Optional[hnswlib.Index] = None
|
|
210
|
+
instance._max_elements = initial_capacity
|
|
211
|
+
instance._current_count = 0
|
|
212
|
+
|
|
213
|
+
logger.info(
|
|
214
|
+
f"Initialized centralized ANNIndex at {instance.hnsw_path} with "
|
|
215
|
+
f"capacity={initial_capacity}, auto_save={auto_save}"
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
return instance
|
|
219
|
+
|
|
130
220
|
def _ensure_index(self) -> None:
|
|
131
221
|
"""Ensure HNSW index is initialized (lazy initialization)."""
|
|
132
222
|
if self._index is None:
|
|
@@ -412,3 +502,567 @@ class ANNIndex:
|
|
|
412
502
|
"""
|
|
413
503
|
with self._lock:
|
|
414
504
|
return self._index is not None and self._current_count > 0
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
class BinaryANNIndex:
|
|
509
|
+
"""Binary vector ANN index using Hamming distance for fast coarse retrieval.
|
|
510
|
+
|
|
511
|
+
.. deprecated::
|
|
512
|
+
This class is deprecated. Use :class:`codexlens.search.binary_searcher.BinarySearcher`
|
|
513
|
+
instead, which provides faster memory-mapped search with centralized storage.
|
|
514
|
+
|
|
515
|
+
Optimized for binary vectors (256-bit / 32 bytes per vector).
|
|
516
|
+
Uses packed binary representation for memory efficiency.
|
|
517
|
+
|
|
518
|
+
Performance characteristics:
|
|
519
|
+
- Storage: 32 bytes per vector (vs ~8KB for dense vectors)
|
|
520
|
+
- Distance: Hamming distance via XOR + popcount (CPU-efficient)
|
|
521
|
+
- Search: O(N) brute-force with SIMD-accelerated distance computation
|
|
522
|
+
|
|
523
|
+
Index parameters:
|
|
524
|
+
- dim: Binary vector dimension (default: 256)
|
|
525
|
+
- packed_dim: Packed bytes size (dim / 8 = 32 for 256-bit)
|
|
526
|
+
|
|
527
|
+
Usage:
|
|
528
|
+
index = BinaryANNIndex(index_path, dim=256)
|
|
529
|
+
index.add_vectors([1, 2, 3], packed_vectors) # List of 32-byte packed vectors
|
|
530
|
+
ids, distances = index.search(query_packed, top_k=10)
|
|
531
|
+
"""
|
|
532
|
+
|
|
533
|
+
DEFAULT_DIM = 256 # Default binary vector dimension
|
|
534
|
+
|
|
535
|
+
def __init__(
|
|
536
|
+
self,
|
|
537
|
+
index_path: Path,
|
|
538
|
+
dim: int = 256,
|
|
539
|
+
initial_capacity: int = 100000,
|
|
540
|
+
auto_save: bool = False,
|
|
541
|
+
) -> None:
|
|
542
|
+
"""Initialize Binary ANN index.
|
|
543
|
+
|
|
544
|
+
Args:
|
|
545
|
+
index_path: Path to database (index will be saved as _binary_vectors.bin)
|
|
546
|
+
dim: Dimension of binary vectors (default: 256)
|
|
547
|
+
initial_capacity: Initial capacity hint (default: 100000)
|
|
548
|
+
auto_save: Whether to automatically save index after operations
|
|
549
|
+
|
|
550
|
+
Raises:
|
|
551
|
+
ImportError: If required dependencies are not available
|
|
552
|
+
ValueError: If dimension is invalid
|
|
553
|
+
"""
|
|
554
|
+
if not SEMANTIC_AVAILABLE:
|
|
555
|
+
raise ImportError(
|
|
556
|
+
"Semantic search dependencies not available. "
|
|
557
|
+
"Install with: pip install codexlens[semantic]"
|
|
558
|
+
)
|
|
559
|
+
|
|
560
|
+
import warnings
|
|
561
|
+
warnings.warn(
|
|
562
|
+
"BinaryANNIndex is deprecated. Use codexlens.search.binary_searcher.BinarySearcher "
|
|
563
|
+
"instead for faster memory-mapped search with centralized storage.",
|
|
564
|
+
DeprecationWarning,
|
|
565
|
+
stacklevel=2
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
if dim <= 0 or dim % 8 != 0:
|
|
569
|
+
raise ValueError(
|
|
570
|
+
f"Invalid dimension: {dim}. Must be positive and divisible by 8."
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
self.index_path = Path(index_path)
|
|
574
|
+
self.dim = dim
|
|
575
|
+
self.packed_dim = dim // 8 # 32 bytes for 256-bit vectors
|
|
576
|
+
|
|
577
|
+
# Derive binary index path from database path
|
|
578
|
+
db_stem = self.index_path.stem
|
|
579
|
+
self.binary_path = self.index_path.parent / f"{db_stem}_binary_vectors.bin"
|
|
580
|
+
|
|
581
|
+
# Memory management
|
|
582
|
+
self._auto_save = auto_save
|
|
583
|
+
self._initial_capacity = initial_capacity
|
|
584
|
+
|
|
585
|
+
# Thread safety
|
|
586
|
+
self._lock = threading.RLock()
|
|
587
|
+
|
|
588
|
+
# In-memory storage: id -> packed binary vector
|
|
589
|
+
self._vectors: dict[int, bytes] = {}
|
|
590
|
+
self._id_list: list[int] = [] # Ordered list for efficient iteration
|
|
591
|
+
|
|
592
|
+
# Cached numpy array for vectorized search (invalidated on add/remove)
|
|
593
|
+
self._vectors_matrix: Optional[np.ndarray] = None
|
|
594
|
+
self._ids_array: Optional[np.ndarray] = None
|
|
595
|
+
self._cache_valid: bool = False
|
|
596
|
+
|
|
597
|
+
logger.info(
|
|
598
|
+
f"Initialized BinaryANNIndex with dim={dim}, packed_dim={self.packed_dim}"
|
|
599
|
+
)
|
|
600
|
+
|
|
601
|
+
def add_vectors(self, ids: List[int], vectors: List[bytes]) -> None:
|
|
602
|
+
"""Add packed binary vectors to the index.
|
|
603
|
+
|
|
604
|
+
Args:
|
|
605
|
+
ids: List of vector IDs (must be unique)
|
|
606
|
+
vectors: List of packed binary vectors (each of size packed_dim bytes)
|
|
607
|
+
|
|
608
|
+
Raises:
|
|
609
|
+
ValueError: If shapes don't match or vectors are invalid
|
|
610
|
+
StorageError: If index operation fails
|
|
611
|
+
"""
|
|
612
|
+
if len(ids) == 0:
|
|
613
|
+
return
|
|
614
|
+
|
|
615
|
+
if len(vectors) != len(ids):
|
|
616
|
+
raise ValueError(
|
|
617
|
+
f"Number of vectors ({len(vectors)}) must match number of IDs ({len(ids)})"
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
# Validate vector sizes
|
|
621
|
+
for i, vec in enumerate(vectors):
|
|
622
|
+
if len(vec) != self.packed_dim:
|
|
623
|
+
raise ValueError(
|
|
624
|
+
f"Vector {i} has size {len(vec)}, expected {self.packed_dim}"
|
|
625
|
+
)
|
|
626
|
+
|
|
627
|
+
with self._lock:
|
|
628
|
+
try:
|
|
629
|
+
for vec_id, vec in zip(ids, vectors):
|
|
630
|
+
if vec_id not in self._vectors:
|
|
631
|
+
self._id_list.append(vec_id)
|
|
632
|
+
self._vectors[vec_id] = vec
|
|
633
|
+
|
|
634
|
+
# Invalidate cache on modification
|
|
635
|
+
self._cache_valid = False
|
|
636
|
+
|
|
637
|
+
logger.debug(
|
|
638
|
+
f"Added {len(ids)} binary vectors to index (total: {len(self._vectors)})"
|
|
639
|
+
)
|
|
640
|
+
|
|
641
|
+
if self._auto_save:
|
|
642
|
+
self.save()
|
|
643
|
+
|
|
644
|
+
except Exception as e:
|
|
645
|
+
raise StorageError(f"Failed to add vectors to Binary ANN index: {e}")
|
|
646
|
+
|
|
647
|
+
def add_vectors_numpy(self, ids: List[int], vectors: np.ndarray) -> None:
|
|
648
|
+
"""Add unpacked binary vectors (0/1 values) to the index.
|
|
649
|
+
|
|
650
|
+
Convenience method that packs the vectors before adding.
|
|
651
|
+
|
|
652
|
+
Args:
|
|
653
|
+
ids: List of vector IDs (must be unique)
|
|
654
|
+
vectors: Numpy array of shape (N, dim) with binary values (0 or 1)
|
|
655
|
+
|
|
656
|
+
Raises:
|
|
657
|
+
ValueError: If shapes don't match
|
|
658
|
+
StorageError: If index operation fails
|
|
659
|
+
"""
|
|
660
|
+
if len(ids) == 0:
|
|
661
|
+
return
|
|
662
|
+
|
|
663
|
+
if vectors.shape[0] != len(ids):
|
|
664
|
+
raise ValueError(
|
|
665
|
+
f"Number of vectors ({vectors.shape[0]}) must match number of IDs ({len(ids)})"
|
|
666
|
+
)
|
|
667
|
+
|
|
668
|
+
if vectors.shape[1] != self.dim:
|
|
669
|
+
raise ValueError(
|
|
670
|
+
f"Vector dimension ({vectors.shape[1]}) must match index dimension ({self.dim})"
|
|
671
|
+
)
|
|
672
|
+
|
|
673
|
+
# Pack vectors
|
|
674
|
+
packed_vectors = []
|
|
675
|
+
for i in range(vectors.shape[0]):
|
|
676
|
+
packed = np.packbits(vectors[i].astype(np.uint8)).tobytes()
|
|
677
|
+
packed_vectors.append(packed)
|
|
678
|
+
|
|
679
|
+
self.add_vectors(ids, packed_vectors)
|
|
680
|
+
|
|
681
|
+
def remove_vectors(self, ids: List[int]) -> None:
|
|
682
|
+
"""Remove vectors from the index.
|
|
683
|
+
|
|
684
|
+
Args:
|
|
685
|
+
ids: List of vector IDs to remove
|
|
686
|
+
|
|
687
|
+
Raises:
|
|
688
|
+
StorageError: If index operation fails
|
|
689
|
+
|
|
690
|
+
Note:
|
|
691
|
+
Optimized for batch deletion using set operations instead of
|
|
692
|
+
O(N) list.remove() calls for each ID.
|
|
693
|
+
"""
|
|
694
|
+
if len(ids) == 0:
|
|
695
|
+
return
|
|
696
|
+
|
|
697
|
+
with self._lock:
|
|
698
|
+
try:
|
|
699
|
+
# Use set for O(1) lookup during filtering
|
|
700
|
+
ids_to_remove = set(ids)
|
|
701
|
+
removed_count = 0
|
|
702
|
+
|
|
703
|
+
# Remove from dictionary - O(1) per deletion
|
|
704
|
+
for vec_id in ids_to_remove:
|
|
705
|
+
if vec_id in self._vectors:
|
|
706
|
+
del self._vectors[vec_id]
|
|
707
|
+
removed_count += 1
|
|
708
|
+
|
|
709
|
+
# Rebuild ID list efficiently - O(N) once instead of O(N) per removal
|
|
710
|
+
if removed_count > 0:
|
|
711
|
+
self._id_list = [id_ for id_ in self._id_list if id_ not in ids_to_remove]
|
|
712
|
+
# Invalidate cache on modification
|
|
713
|
+
self._cache_valid = False
|
|
714
|
+
|
|
715
|
+
logger.debug(f"Removed {removed_count}/{len(ids)} vectors from index")
|
|
716
|
+
|
|
717
|
+
if self._auto_save and removed_count > 0:
|
|
718
|
+
self.save()
|
|
719
|
+
|
|
720
|
+
except Exception as e:
|
|
721
|
+
raise StorageError(
|
|
722
|
+
f"Failed to remove vectors from Binary ANN index: {e}"
|
|
723
|
+
)
|
|
724
|
+
|
|
725
|
+
def _build_cache(self) -> None:
|
|
726
|
+
"""Build numpy array cache from vectors dict for vectorized search.
|
|
727
|
+
|
|
728
|
+
Pre-computes a contiguous numpy array from all vectors for efficient
|
|
729
|
+
batch distance computation. Called lazily on first search after modification.
|
|
730
|
+
"""
|
|
731
|
+
if self._cache_valid:
|
|
732
|
+
return
|
|
733
|
+
|
|
734
|
+
n_vectors = len(self._id_list)
|
|
735
|
+
if n_vectors == 0:
|
|
736
|
+
self._vectors_matrix = None
|
|
737
|
+
self._ids_array = None
|
|
738
|
+
self._cache_valid = True
|
|
739
|
+
return
|
|
740
|
+
|
|
741
|
+
# Build contiguous numpy array of all packed vectors
|
|
742
|
+
# Shape: (n_vectors, packed_dim) with uint8 dtype
|
|
743
|
+
self._vectors_matrix = np.empty((n_vectors, self.packed_dim), dtype=np.uint8)
|
|
744
|
+
self._ids_array = np.array(self._id_list, dtype=np.int64)
|
|
745
|
+
|
|
746
|
+
for i, vec_id in enumerate(self._id_list):
|
|
747
|
+
vec_bytes = self._vectors[vec_id]
|
|
748
|
+
self._vectors_matrix[i] = np.frombuffer(vec_bytes, dtype=np.uint8)
|
|
749
|
+
|
|
750
|
+
self._cache_valid = True
|
|
751
|
+
logger.debug(f"Built vectorized cache for {n_vectors} binary vectors")
|
|
752
|
+
|
|
753
|
+
def search(
|
|
754
|
+
self, query: bytes, top_k: int = 10
|
|
755
|
+
) -> Tuple[List[int], List[int]]:
|
|
756
|
+
"""Search for nearest neighbors using Hamming distance.
|
|
757
|
+
|
|
758
|
+
Uses vectorized batch computation for O(N) search with SIMD acceleration.
|
|
759
|
+
Pre-computes and caches numpy arrays for efficient repeated queries.
|
|
760
|
+
|
|
761
|
+
Args:
|
|
762
|
+
query: Packed binary query vector (size: packed_dim bytes)
|
|
763
|
+
top_k: Number of nearest neighbors to return
|
|
764
|
+
|
|
765
|
+
Returns:
|
|
766
|
+
Tuple of (ids, distances) where:
|
|
767
|
+
- ids: List of vector IDs ordered by Hamming distance (ascending)
|
|
768
|
+
- distances: List of Hamming distances (lower = more similar)
|
|
769
|
+
|
|
770
|
+
Raises:
|
|
771
|
+
ValueError: If query size is invalid
|
|
772
|
+
StorageError: If search operation fails
|
|
773
|
+
"""
|
|
774
|
+
if len(query) != self.packed_dim:
|
|
775
|
+
raise ValueError(
|
|
776
|
+
f"Query size ({len(query)}) must match packed_dim ({self.packed_dim})"
|
|
777
|
+
)
|
|
778
|
+
|
|
779
|
+
with self._lock:
|
|
780
|
+
try:
|
|
781
|
+
if len(self._vectors) == 0:
|
|
782
|
+
return [], []
|
|
783
|
+
|
|
784
|
+
# Build cache if needed (lazy initialization)
|
|
785
|
+
self._build_cache()
|
|
786
|
+
|
|
787
|
+
if self._vectors_matrix is None or self._ids_array is None:
|
|
788
|
+
return [], []
|
|
789
|
+
|
|
790
|
+
# Vectorized Hamming distance computation
|
|
791
|
+
# 1. Convert query to numpy array
|
|
792
|
+
query_arr = np.frombuffer(query, dtype=np.uint8)
|
|
793
|
+
|
|
794
|
+
# 2. Broadcast XOR: (1, packed_dim) XOR (n_vectors, packed_dim)
|
|
795
|
+
# Result shape: (n_vectors, packed_dim)
|
|
796
|
+
xor_result = np.bitwise_xor(query_arr, self._vectors_matrix)
|
|
797
|
+
|
|
798
|
+
# 3. Vectorized popcount using lookup table for efficiency
|
|
799
|
+
# np.unpackbits is slow for large arrays, use popcount LUT instead
|
|
800
|
+
popcount_lut = np.array([bin(i).count('1') for i in range(256)], dtype=np.uint8)
|
|
801
|
+
bit_counts = popcount_lut[xor_result]
|
|
802
|
+
|
|
803
|
+
# 4. Sum across packed bytes to get Hamming distance per vector
|
|
804
|
+
distances = bit_counts.sum(axis=1)
|
|
805
|
+
|
|
806
|
+
# 5. Get top-k using argpartition (O(N) instead of O(N log N) for full sort)
|
|
807
|
+
n_vectors = len(distances)
|
|
808
|
+
k = min(top_k, n_vectors)
|
|
809
|
+
|
|
810
|
+
if k == n_vectors:
|
|
811
|
+
# No partitioning needed, just sort all
|
|
812
|
+
sorted_indices = np.argsort(distances)
|
|
813
|
+
else:
|
|
814
|
+
# Use argpartition for O(N) partial sort
|
|
815
|
+
partition_indices = np.argpartition(distances, k)[:k]
|
|
816
|
+
# Sort only the top-k
|
|
817
|
+
top_k_distances = distances[partition_indices]
|
|
818
|
+
sorted_order = np.argsort(top_k_distances)
|
|
819
|
+
sorted_indices = partition_indices[sorted_order]
|
|
820
|
+
|
|
821
|
+
# 6. Return results
|
|
822
|
+
result_ids = self._ids_array[sorted_indices].tolist()
|
|
823
|
+
result_dists = distances[sorted_indices].tolist()
|
|
824
|
+
|
|
825
|
+
return result_ids, result_dists
|
|
826
|
+
|
|
827
|
+
except Exception as e:
|
|
828
|
+
raise StorageError(f"Failed to search Binary ANN index: {e}")
|
|
829
|
+
|
|
830
|
+
def search_numpy(
|
|
831
|
+
self, query: np.ndarray, top_k: int = 10
|
|
832
|
+
) -> Tuple[List[int], List[int]]:
|
|
833
|
+
"""Search with unpacked binary query vector.
|
|
834
|
+
|
|
835
|
+
Convenience method that packs the query before searching.
|
|
836
|
+
|
|
837
|
+
Args:
|
|
838
|
+
query: Binary query vector of shape (dim,) with values 0 or 1
|
|
839
|
+
top_k: Number of nearest neighbors to return
|
|
840
|
+
|
|
841
|
+
Returns:
|
|
842
|
+
Tuple of (ids, distances)
|
|
843
|
+
"""
|
|
844
|
+
if query.ndim == 2:
|
|
845
|
+
query = query.flatten()
|
|
846
|
+
|
|
847
|
+
if len(query) != self.dim:
|
|
848
|
+
raise ValueError(
|
|
849
|
+
f"Query dimension ({len(query)}) must match index dimension ({self.dim})"
|
|
850
|
+
)
|
|
851
|
+
|
|
852
|
+
packed_query = np.packbits(query.astype(np.uint8)).tobytes()
|
|
853
|
+
return self.search(packed_query, top_k)
|
|
854
|
+
|
|
855
|
+
def search_batch(
|
|
856
|
+
self, queries: List[bytes], top_k: int = 10
|
|
857
|
+
) -> List[Tuple[List[int], List[int]]]:
|
|
858
|
+
"""Batch search for multiple queries.
|
|
859
|
+
|
|
860
|
+
Args:
|
|
861
|
+
queries: List of packed binary query vectors
|
|
862
|
+
top_k: Number of nearest neighbors to return per query
|
|
863
|
+
|
|
864
|
+
Returns:
|
|
865
|
+
List of (ids, distances) tuples, one per query
|
|
866
|
+
"""
|
|
867
|
+
results = []
|
|
868
|
+
for query in queries:
|
|
869
|
+
ids, dists = self.search(query, top_k)
|
|
870
|
+
results.append((ids, dists))
|
|
871
|
+
return results
|
|
872
|
+
|
|
873
|
+
def save(self) -> None:
|
|
874
|
+
"""Save index to disk.
|
|
875
|
+
|
|
876
|
+
Binary format:
|
|
877
|
+
- 4 bytes: magic number (0x42494E56 = "BINV")
|
|
878
|
+
- 4 bytes: version (1)
|
|
879
|
+
- 4 bytes: dim
|
|
880
|
+
- 4 bytes: packed_dim
|
|
881
|
+
- 4 bytes: num_vectors
|
|
882
|
+
- For each vector:
|
|
883
|
+
- 4 bytes: id
|
|
884
|
+
- packed_dim bytes: vector data
|
|
885
|
+
|
|
886
|
+
Raises:
|
|
887
|
+
StorageError: If save operation fails
|
|
888
|
+
"""
|
|
889
|
+
with self._lock:
|
|
890
|
+
try:
|
|
891
|
+
if len(self._vectors) == 0:
|
|
892
|
+
logger.debug("Skipping save: index is empty")
|
|
893
|
+
return
|
|
894
|
+
|
|
895
|
+
# Ensure parent directory exists
|
|
896
|
+
self.binary_path.parent.mkdir(parents=True, exist_ok=True)
|
|
897
|
+
|
|
898
|
+
with open(self.binary_path, "wb") as f:
|
|
899
|
+
# Header
|
|
900
|
+
f.write(b"BINV") # Magic number
|
|
901
|
+
f.write(np.array([1], dtype=np.uint32).tobytes()) # Version
|
|
902
|
+
f.write(np.array([self.dim], dtype=np.uint32).tobytes())
|
|
903
|
+
f.write(np.array([self.packed_dim], dtype=np.uint32).tobytes())
|
|
904
|
+
f.write(
|
|
905
|
+
np.array([len(self._vectors)], dtype=np.uint32).tobytes()
|
|
906
|
+
)
|
|
907
|
+
|
|
908
|
+
# Vectors
|
|
909
|
+
for vec_id in self._id_list:
|
|
910
|
+
f.write(np.array([vec_id], dtype=np.uint32).tobytes())
|
|
911
|
+
f.write(self._vectors[vec_id])
|
|
912
|
+
|
|
913
|
+
logger.debug(
|
|
914
|
+
f"Saved binary index to {self.binary_path} "
|
|
915
|
+
f"({len(self._vectors)} vectors)"
|
|
916
|
+
)
|
|
917
|
+
|
|
918
|
+
except Exception as e:
|
|
919
|
+
raise StorageError(f"Failed to save Binary ANN index: {e}")
|
|
920
|
+
|
|
921
|
+
def load(self) -> bool:
|
|
922
|
+
"""Load index from disk.
|
|
923
|
+
|
|
924
|
+
Returns:
|
|
925
|
+
True if index was loaded successfully, False if index file doesn't exist
|
|
926
|
+
|
|
927
|
+
Raises:
|
|
928
|
+
StorageError: If load operation fails
|
|
929
|
+
"""
|
|
930
|
+
with self._lock:
|
|
931
|
+
try:
|
|
932
|
+
if not self.binary_path.exists():
|
|
933
|
+
logger.debug(f"Binary index file not found: {self.binary_path}")
|
|
934
|
+
return False
|
|
935
|
+
|
|
936
|
+
with open(self.binary_path, "rb") as f:
|
|
937
|
+
# Read header
|
|
938
|
+
magic = f.read(4)
|
|
939
|
+
if magic != b"BINV":
|
|
940
|
+
raise StorageError(
|
|
941
|
+
f"Invalid binary index file: bad magic number"
|
|
942
|
+
)
|
|
943
|
+
|
|
944
|
+
version = np.frombuffer(f.read(4), dtype=np.uint32)[0]
|
|
945
|
+
if version != 1:
|
|
946
|
+
raise StorageError(
|
|
947
|
+
f"Unsupported binary index version: {version}"
|
|
948
|
+
)
|
|
949
|
+
|
|
950
|
+
file_dim = np.frombuffer(f.read(4), dtype=np.uint32)[0]
|
|
951
|
+
file_packed_dim = np.frombuffer(f.read(4), dtype=np.uint32)[0]
|
|
952
|
+
num_vectors = np.frombuffer(f.read(4), dtype=np.uint32)[0]
|
|
953
|
+
|
|
954
|
+
if file_dim != self.dim or file_packed_dim != self.packed_dim:
|
|
955
|
+
raise StorageError(
|
|
956
|
+
f"Dimension mismatch: file has dim={file_dim}, "
|
|
957
|
+
f"packed_dim={file_packed_dim}, "
|
|
958
|
+
f"expected dim={self.dim}, packed_dim={self.packed_dim}"
|
|
959
|
+
)
|
|
960
|
+
|
|
961
|
+
# Clear existing data
|
|
962
|
+
self._vectors.clear()
|
|
963
|
+
self._id_list.clear()
|
|
964
|
+
self._cache_valid = False
|
|
965
|
+
|
|
966
|
+
# Read vectors
|
|
967
|
+
for _ in range(num_vectors):
|
|
968
|
+
vec_id = np.frombuffer(f.read(4), dtype=np.uint32)[0]
|
|
969
|
+
vec_data = f.read(self.packed_dim)
|
|
970
|
+
self._vectors[int(vec_id)] = vec_data
|
|
971
|
+
self._id_list.append(int(vec_id))
|
|
972
|
+
|
|
973
|
+
logger.info(
|
|
974
|
+
f"Loaded binary index from {self.binary_path} "
|
|
975
|
+
f"({len(self._vectors)} vectors)"
|
|
976
|
+
)
|
|
977
|
+
|
|
978
|
+
return True
|
|
979
|
+
|
|
980
|
+
except StorageError:
|
|
981
|
+
raise
|
|
982
|
+
except Exception as e:
|
|
983
|
+
raise StorageError(f"Failed to load Binary ANN index: {e}")
|
|
984
|
+
|
|
985
|
+
def count(self) -> int:
|
|
986
|
+
"""Get number of vectors in the index.
|
|
987
|
+
|
|
988
|
+
Returns:
|
|
989
|
+
Number of vectors currently in the index
|
|
990
|
+
"""
|
|
991
|
+
with self._lock:
|
|
992
|
+
return len(self._vectors)
|
|
993
|
+
|
|
994
|
+
@property
|
|
995
|
+
def is_loaded(self) -> bool:
|
|
996
|
+
"""Check if index has vectors.
|
|
997
|
+
|
|
998
|
+
Returns:
|
|
999
|
+
True if index has vectors, False otherwise
|
|
1000
|
+
"""
|
|
1001
|
+
with self._lock:
|
|
1002
|
+
return len(self._vectors) > 0
|
|
1003
|
+
|
|
1004
|
+
def get_vector(self, vec_id: int) -> Optional[bytes]:
|
|
1005
|
+
"""Get a specific vector by ID.
|
|
1006
|
+
|
|
1007
|
+
Args:
|
|
1008
|
+
vec_id: Vector ID to retrieve
|
|
1009
|
+
|
|
1010
|
+
Returns:
|
|
1011
|
+
Packed binary vector or None if not found
|
|
1012
|
+
"""
|
|
1013
|
+
with self._lock:
|
|
1014
|
+
return self._vectors.get(vec_id)
|
|
1015
|
+
|
|
1016
|
+
def clear(self) -> None:
|
|
1017
|
+
"""Clear all vectors from the index."""
|
|
1018
|
+
with self._lock:
|
|
1019
|
+
self._vectors.clear()
|
|
1020
|
+
self._id_list.clear()
|
|
1021
|
+
self._vectors_matrix = None
|
|
1022
|
+
self._ids_array = None
|
|
1023
|
+
self._cache_valid = False
|
|
1024
|
+
logger.debug("Cleared binary index")
|
|
1025
|
+
|
|
1026
|
+
|
|
1027
|
+
def create_ann_index(
|
|
1028
|
+
index_path: Path,
|
|
1029
|
+
index_type: str = "hnsw",
|
|
1030
|
+
dim: int = 2048,
|
|
1031
|
+
**kwargs,
|
|
1032
|
+
) -> ANNIndex | BinaryANNIndex:
|
|
1033
|
+
"""Factory function to create an ANN index.
|
|
1034
|
+
|
|
1035
|
+
Args:
|
|
1036
|
+
index_path: Path to database file
|
|
1037
|
+
index_type: Type of index - "hnsw" for dense vectors, "binary" for binary vectors
|
|
1038
|
+
dim: Vector dimension (default: 2048 for dense, 256 for binary)
|
|
1039
|
+
**kwargs: Additional arguments passed to the index constructor
|
|
1040
|
+
|
|
1041
|
+
Returns:
|
|
1042
|
+
ANNIndex for dense vectors or BinaryANNIndex for binary vectors
|
|
1043
|
+
|
|
1044
|
+
Raises:
|
|
1045
|
+
ValueError: If index_type is invalid
|
|
1046
|
+
|
|
1047
|
+
Example:
|
|
1048
|
+
>>> # Dense vector index (HNSW)
|
|
1049
|
+
>>> dense_index = create_ann_index(path, index_type="hnsw", dim=2048)
|
|
1050
|
+
>>> dense_index.add_vectors(ids, dense_vectors)
|
|
1051
|
+
>>>
|
|
1052
|
+
>>> # Binary vector index (Hamming distance)
|
|
1053
|
+
>>> binary_index = create_ann_index(path, index_type="binary", dim=256)
|
|
1054
|
+
>>> binary_index.add_vectors(ids, packed_vectors)
|
|
1055
|
+
"""
|
|
1056
|
+
index_type = index_type.lower()
|
|
1057
|
+
|
|
1058
|
+
if index_type == "hnsw":
|
|
1059
|
+
return ANNIndex(index_path=index_path, dim=dim, **kwargs)
|
|
1060
|
+
elif index_type == "binary":
|
|
1061
|
+
# Default to 256 for binary if not specified
|
|
1062
|
+
if dim == 2048: # Default dense dim was used
|
|
1063
|
+
dim = 256
|
|
1064
|
+
return BinaryANNIndex(index_path=index_path, dim=dim, **kwargs)
|
|
1065
|
+
else:
|
|
1066
|
+
raise ValueError(
|
|
1067
|
+
f"Invalid index_type: {index_type}. Must be 'hnsw' or 'binary'."
|
|
1068
|
+
)
|