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
|
@@ -6,9 +6,174 @@ var currentCliExecution = null;
|
|
|
6
6
|
var cliExecutionOutput = '';
|
|
7
7
|
var ccwInstallations = [];
|
|
8
8
|
var ccwEndpointTools = [];
|
|
9
|
+
var cliWrapperEndpoints = []; // CLI封装 endpoints from /api/cli/settings
|
|
9
10
|
var cliToolConfig = null; // Store loaded CLI config
|
|
10
11
|
var predefinedModels = {}; // Store predefined models per tool
|
|
11
12
|
|
|
13
|
+
// ========== Cache Key Mapping ==========
|
|
14
|
+
// 缓存键映射(旧键名 -> 新键名)
|
|
15
|
+
var CLI_CACHE_KEY_MAP = {
|
|
16
|
+
toolConfig: 'cli-config',
|
|
17
|
+
toolStatus: 'cli-status',
|
|
18
|
+
installations: 'cli-installations',
|
|
19
|
+
endpointTools: 'cli-endpoint-tools',
|
|
20
|
+
litellmEndpoints: 'cli-litellm-endpoints',
|
|
21
|
+
customEndpoints: 'cli-custom-endpoints',
|
|
22
|
+
wrapperEndpoints: 'cli-wrapper-endpoints'
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// ========== CLI Cache Bridge ==========
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 获取 CLI 缓存数据
|
|
29
|
+
* @param {string} key - 缓存键
|
|
30
|
+
* @returns {*} 缓存的数据或 null
|
|
31
|
+
*/
|
|
32
|
+
function getCliCachedData(key) {
|
|
33
|
+
if (!window.cacheManager) return null;
|
|
34
|
+
var newKey = CLI_CACHE_KEY_MAP[key] || key;
|
|
35
|
+
return window.cacheManager.get(newKey);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 设置 CLI 缓存数据
|
|
40
|
+
* @param {string} key - 缓存键
|
|
41
|
+
* @param {*} data - 要缓存的数据
|
|
42
|
+
* @param {number} ttl - 缓存 TTL(毫秒),默认 5 分钟
|
|
43
|
+
*/
|
|
44
|
+
function setCliCacheData(key, data, ttl) {
|
|
45
|
+
if (!window.cacheManager) return;
|
|
46
|
+
ttl = ttl || 300000;
|
|
47
|
+
var newKey = CLI_CACHE_KEY_MAP[key] || key;
|
|
48
|
+
window.cacheManager.set(newKey, data, ttl);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 注册 CLI 相关数据源到预加载服务
|
|
53
|
+
* 仅在数据源尚未注册时添加
|
|
54
|
+
*/
|
|
55
|
+
function registerCliDataSources() {
|
|
56
|
+
if (!window.preloadService) return;
|
|
57
|
+
|
|
58
|
+
var sources = [
|
|
59
|
+
{ key: 'cli-installations', url: '/api/ccw/installations', priority: false, ttl: 300000 },
|
|
60
|
+
{ key: 'cli-endpoint-tools', url: '/api/ccw/tools', priority: false, ttl: 300000 },
|
|
61
|
+
{ key: 'cli-litellm-endpoints', url: '/api/litellm-api/config', priority: false, ttl: 300000 },
|
|
62
|
+
{ key: 'cli-custom-endpoints', url: '/api/cli/endpoints', priority: false, ttl: 300000 },
|
|
63
|
+
{ key: 'cli-wrapper-endpoints', url: '/api/cli/settings', priority: false, ttl: 300000 }
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
sources.forEach(function(src) {
|
|
67
|
+
if (!window.preloadService.sources.has(src.key)) {
|
|
68
|
+
window.preloadService.register(src.key,
|
|
69
|
+
function() { return fetch(src.url).then(function(r) { return r.ok ? r.json() : Promise.reject(r); }); },
|
|
70
|
+
{ isHighPriority: src.priority, ttl: src.ttl }
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ========== CSRF Token Management ==========
|
|
77
|
+
var csrfToken = null; // Store CSRF token for state-changing requests
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Fetch wrapper that handles CSRF token management
|
|
81
|
+
* Captures new token from response and includes token in requests
|
|
82
|
+
*/
|
|
83
|
+
async function csrfFetch(url, options) {
|
|
84
|
+
options = options || {};
|
|
85
|
+
options.headers = options.headers || {};
|
|
86
|
+
|
|
87
|
+
// Add CSRF token header for state-changing methods
|
|
88
|
+
var method = (options.method || 'GET').toUpperCase();
|
|
89
|
+
|
|
90
|
+
// Auto-initialize CSRF token for state-changing requests
|
|
91
|
+
if (['POST', 'PUT', 'PATCH', 'DELETE'].indexOf(method) !== -1) {
|
|
92
|
+
await initCsrfToken();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (['POST', 'PUT', 'PATCH', 'DELETE'].indexOf(method) !== -1 && csrfToken) {
|
|
96
|
+
options.headers['X-CSRF-Token'] = csrfToken;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
var response = await fetch(url, options);
|
|
100
|
+
|
|
101
|
+
// Capture new CSRF token from response
|
|
102
|
+
var newToken = response.headers.get('X-CSRF-Token');
|
|
103
|
+
if (newToken) {
|
|
104
|
+
csrfToken = newToken;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return response;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Initialize CSRF token by fetching from server
|
|
112
|
+
* Should be called before any state-changing requests
|
|
113
|
+
*/
|
|
114
|
+
async function initCsrfToken() {
|
|
115
|
+
if (csrfToken) return; // Already initialized
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
var response = await fetch('/api/csrf-token');
|
|
119
|
+
if (response.ok) {
|
|
120
|
+
var data = await response.json();
|
|
121
|
+
csrfToken = data.csrfToken || response.headers.get('X-CSRF-Token');
|
|
122
|
+
}
|
|
123
|
+
} catch (err) {
|
|
124
|
+
console.warn('[CLI Manager] Failed to fetch CSRF token:', err);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ========== Active Execution Sync ==========
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Sync active CLI executions from server
|
|
132
|
+
* Called when view is opened to restore running execution state
|
|
133
|
+
*/
|
|
134
|
+
async function syncActiveExecutions() {
|
|
135
|
+
try {
|
|
136
|
+
var response = await fetch('/api/cli/active');
|
|
137
|
+
if (!response.ok) return;
|
|
138
|
+
|
|
139
|
+
var data = await response.json();
|
|
140
|
+
if (!data.executions || data.executions.length === 0) return;
|
|
141
|
+
|
|
142
|
+
// Restore the first active execution
|
|
143
|
+
var active = data.executions[0];
|
|
144
|
+
|
|
145
|
+
// Restore execution state
|
|
146
|
+
currentCliExecution = {
|
|
147
|
+
executionId: active.id,
|
|
148
|
+
tool: active.tool,
|
|
149
|
+
mode: active.mode,
|
|
150
|
+
startTime: active.startTime
|
|
151
|
+
};
|
|
152
|
+
cliExecutionOutput = active.output || '';
|
|
153
|
+
|
|
154
|
+
// Update UI if output panel exists
|
|
155
|
+
var outputPanel = document.getElementById('cli-output-panel');
|
|
156
|
+
var outputContent = document.getElementById('cli-output-content');
|
|
157
|
+
|
|
158
|
+
if (outputPanel && outputContent) {
|
|
159
|
+
outputPanel.style.display = 'block';
|
|
160
|
+
outputContent.textContent = cliExecutionOutput;
|
|
161
|
+
outputContent.scrollTop = outputContent.scrollHeight;
|
|
162
|
+
|
|
163
|
+
// Update status indicator
|
|
164
|
+
var statusIndicator = outputPanel.querySelector('.cli-status-indicator');
|
|
165
|
+
if (statusIndicator) {
|
|
166
|
+
statusIndicator.className = 'cli-status-indicator running';
|
|
167
|
+
statusIndicator.textContent = t('cli.running') || 'Running...';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
console.log('[CLI Manager] Restored active execution:', active.id);
|
|
172
|
+
} catch (err) {
|
|
173
|
+
console.warn('[CLI Manager] Failed to sync active executions:', err);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
12
177
|
// ========== Navigation Helpers ==========
|
|
13
178
|
|
|
14
179
|
/**
|
|
@@ -92,9 +257,50 @@ async function loadCliCustomEndpoints() {
|
|
|
92
257
|
}
|
|
93
258
|
}
|
|
94
259
|
|
|
260
|
+
// ========== CLI Wrapper Endpoints (CLI封装) ==========
|
|
261
|
+
async function loadCliWrapperEndpoints() {
|
|
262
|
+
try {
|
|
263
|
+
var response = await fetch('/api/cli/settings');
|
|
264
|
+
if (!response.ok) throw new Error('Failed to load CLI wrapper endpoints');
|
|
265
|
+
var data = await response.json();
|
|
266
|
+
cliWrapperEndpoints = data.endpoints || [];
|
|
267
|
+
return cliWrapperEndpoints;
|
|
268
|
+
} catch (err) {
|
|
269
|
+
console.error('Failed to load CLI wrapper endpoints:', err);
|
|
270
|
+
cliWrapperEndpoints = [];
|
|
271
|
+
return [];
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
async function toggleCliWrapperEnabled(endpointId, enabled) {
|
|
276
|
+
try {
|
|
277
|
+
await initCsrfToken();
|
|
278
|
+
var response = await csrfFetch('/api/cli/settings/' + endpointId, {
|
|
279
|
+
method: 'PUT',
|
|
280
|
+
headers: { 'Content-Type': 'application/json' },
|
|
281
|
+
body: JSON.stringify({ enabled: enabled })
|
|
282
|
+
});
|
|
283
|
+
if (!response.ok) throw new Error('Failed to update CLI wrapper endpoint');
|
|
284
|
+
var data = await response.json();
|
|
285
|
+
if (data.success) {
|
|
286
|
+
// Update local state
|
|
287
|
+
var idx = cliWrapperEndpoints.findIndex(function(e) { return e.id === endpointId; });
|
|
288
|
+
if (idx >= 0) {
|
|
289
|
+
cliWrapperEndpoints[idx].enabled = enabled;
|
|
290
|
+
}
|
|
291
|
+
showRefreshToast((enabled ? t('cli.enabled') || 'Enabled' : t('cli.disabled') || 'Disabled') + ': ' + endpointId, 'success');
|
|
292
|
+
}
|
|
293
|
+
return data;
|
|
294
|
+
} catch (err) {
|
|
295
|
+
showRefreshToast((t('cli.updateFailed') || 'Failed to update') + ': ' + err.message, 'error');
|
|
296
|
+
throw err;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
95
300
|
async function toggleEndpointEnabled(endpointId, enabled) {
|
|
96
301
|
try {
|
|
97
|
-
|
|
302
|
+
await initCsrfToken();
|
|
303
|
+
var response = await csrfFetch('/api/cli/endpoints/' + endpointId, {
|
|
98
304
|
method: 'PUT',
|
|
99
305
|
headers: { 'Content-Type': 'application/json' },
|
|
100
306
|
body: JSON.stringify({ enabled: enabled })
|
|
@@ -118,7 +324,8 @@ async function toggleEndpointEnabled(endpointId, enabled) {
|
|
|
118
324
|
|
|
119
325
|
async function syncEndpointToCliTools(endpoint) {
|
|
120
326
|
try {
|
|
121
|
-
|
|
327
|
+
await initCsrfToken();
|
|
328
|
+
var response = await csrfFetch('/api/cli/endpoints', {
|
|
122
329
|
method: 'POST',
|
|
123
330
|
headers: { 'Content-Type': 'application/json' },
|
|
124
331
|
body: JSON.stringify({
|
|
@@ -146,12 +353,23 @@ window.syncEndpointToCliTools = syncEndpointToCliTools;
|
|
|
146
353
|
|
|
147
354
|
// ========== CLI Tool Configuration ==========
|
|
148
355
|
async function loadCliToolConfig() {
|
|
356
|
+
// 尝试从缓存获取
|
|
357
|
+
var cached = getCliCachedData('toolConfig');
|
|
358
|
+
if (cached) {
|
|
359
|
+
cliToolConfig = cached.config || null;
|
|
360
|
+
predefinedModels = cached.predefinedModels || {};
|
|
361
|
+
return cached;
|
|
362
|
+
}
|
|
363
|
+
|
|
149
364
|
try {
|
|
150
365
|
var response = await fetch('/api/cli/config');
|
|
151
366
|
if (!response.ok) throw new Error('Failed to load CLI config');
|
|
152
367
|
var data = await response.json();
|
|
153
368
|
cliToolConfig = data.config || null;
|
|
154
369
|
predefinedModels = data.predefinedModels || {};
|
|
370
|
+
|
|
371
|
+
// 缓存结果
|
|
372
|
+
setCliCacheData('toolConfig', data);
|
|
155
373
|
return data;
|
|
156
374
|
} catch (err) {
|
|
157
375
|
console.error('Failed to load CLI config:', err);
|
|
@@ -163,13 +381,18 @@ async function loadCliToolConfig() {
|
|
|
163
381
|
|
|
164
382
|
async function updateCliToolConfig(tool, updates) {
|
|
165
383
|
try {
|
|
166
|
-
|
|
384
|
+
// Ensure CSRF token is initialized before making state-changing request
|
|
385
|
+
await initCsrfToken();
|
|
386
|
+
|
|
387
|
+
var response = await csrfFetch('/api/cli/config/' + tool, {
|
|
167
388
|
method: 'PUT',
|
|
168
389
|
headers: { 'Content-Type': 'application/json' },
|
|
169
390
|
body: JSON.stringify(updates)
|
|
170
391
|
});
|
|
171
|
-
if (!response.ok) throw new Error('Failed to update CLI config');
|
|
172
392
|
var data = await response.json();
|
|
393
|
+
if (!response.ok) {
|
|
394
|
+
throw new Error(data.error || 'Failed to update CLI config');
|
|
395
|
+
}
|
|
173
396
|
if (data.success && cliToolConfig && cliToolConfig.tools) {
|
|
174
397
|
cliToolConfig.tools[tool] = data.config;
|
|
175
398
|
}
|
|
@@ -281,6 +504,25 @@ function buildToolConfigModalContent(tool, config, models, status) {
|
|
|
281
504
|
'</div>' +
|
|
282
505
|
'</div>' +
|
|
283
506
|
|
|
507
|
+
// Tags Section - Unified input with inline tags
|
|
508
|
+
'<div class="tool-config-section">' +
|
|
509
|
+
'<h4>Tags <span class="text-muted">(optional labels)</span></h4>' +
|
|
510
|
+
'<div class="tags-unified-input" id="tagsUnifiedInput">' +
|
|
511
|
+
(config.tags || []).map(function(tag) {
|
|
512
|
+
return '<span class="tag-item tag-' + escapeHtml(tag) + '">' + escapeHtml(tag) + '<button type="button" class="tag-remove" data-tag="' + escapeHtml(tag) + '">×</button></span>';
|
|
513
|
+
}).join('') +
|
|
514
|
+
'<input type="text" id="tagInput" class="tag-inline-input" placeholder="输入标签按 Enter 添加" />' +
|
|
515
|
+
'</div>' +
|
|
516
|
+
'<div class="predefined-tags-row">' +
|
|
517
|
+
'<button type="button" class="predefined-tag-btn" data-tag="分析"><i data-lucide="search" class="w-3 h-3"></i> 分析</button>' +
|
|
518
|
+
'<button type="button" class="predefined-tag-btn" data-tag="编码"><i data-lucide="code" class="w-3 h-3"></i> 编码</button>' +
|
|
519
|
+
'<button type="button" class="predefined-tag-btn" data-tag="Debug"><i data-lucide="bug" class="w-3 h-3"></i> Debug</button>' +
|
|
520
|
+
'<button type="button" class="predefined-tag-btn" data-tag="重构"><i data-lucide="refresh-cw" class="w-3 h-3"></i> 重构</button>' +
|
|
521
|
+
'<button type="button" class="predefined-tag-btn" data-tag="测试"><i data-lucide="check-square" class="w-3 h-3"></i> 测试</button>' +
|
|
522
|
+
'<button type="button" class="predefined-tag-btn" data-tag="文档"><i data-lucide="file-text" class="w-3 h-3"></i> 文档</button>' +
|
|
523
|
+
'</div>' +
|
|
524
|
+
'</div>' +
|
|
525
|
+
|
|
284
526
|
// Footer
|
|
285
527
|
'<div class="tool-config-footer">' +
|
|
286
528
|
'<button class="btn btn-outline" onclick="closeModal()">' + t('common.cancel') + '</button>' +
|
|
@@ -292,6 +534,91 @@ function buildToolConfigModalContent(tool, config, models, status) {
|
|
|
292
534
|
}
|
|
293
535
|
|
|
294
536
|
function initToolConfigModalEvents(tool, currentConfig, models) {
|
|
537
|
+
// Local tags state (copy from config)
|
|
538
|
+
var currentTags = (currentConfig.tags || []).slice();
|
|
539
|
+
|
|
540
|
+
// Helper to render tags inline with input
|
|
541
|
+
function renderTags() {
|
|
542
|
+
var container = document.getElementById('tagsUnifiedInput');
|
|
543
|
+
var input = document.getElementById('tagInput');
|
|
544
|
+
if (!container) return;
|
|
545
|
+
|
|
546
|
+
// Remove existing tag items but keep the input
|
|
547
|
+
container.querySelectorAll('.tag-item').forEach(function(el) { el.remove(); });
|
|
548
|
+
|
|
549
|
+
// Insert tags before the input
|
|
550
|
+
currentTags.forEach(function(tag) {
|
|
551
|
+
var tagEl = document.createElement('span');
|
|
552
|
+
tagEl.className = 'tag-item tag-' + escapeHtml(tag);
|
|
553
|
+
tagEl.innerHTML = escapeHtml(tag) + '<button type="button" class="tag-remove" data-tag="' + escapeHtml(tag) + '">×</button>';
|
|
554
|
+
container.insertBefore(tagEl, input);
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
// Re-attach remove handlers
|
|
558
|
+
container.querySelectorAll('.tag-remove').forEach(function(btn) {
|
|
559
|
+
btn.onclick = function(e) {
|
|
560
|
+
e.stopPropagation();
|
|
561
|
+
var tagToRemove = this.getAttribute('data-tag');
|
|
562
|
+
currentTags = currentTags.filter(function(t) { return t !== tagToRemove; });
|
|
563
|
+
renderTags();
|
|
564
|
+
};
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
// Update predefined tag buttons state
|
|
568
|
+
document.querySelectorAll('.predefined-tag-btn').forEach(function(btn) {
|
|
569
|
+
var tag = btn.getAttribute('data-tag');
|
|
570
|
+
if (currentTags.indexOf(tag) !== -1) {
|
|
571
|
+
btn.classList.add('selected');
|
|
572
|
+
btn.disabled = true;
|
|
573
|
+
} else {
|
|
574
|
+
btn.classList.remove('selected');
|
|
575
|
+
btn.disabled = false;
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// Click on unified input container focuses the input
|
|
581
|
+
var unifiedInput = document.getElementById('tagsUnifiedInput');
|
|
582
|
+
if (unifiedInput) {
|
|
583
|
+
unifiedInput.onclick = function(e) {
|
|
584
|
+
if (e.target === this) {
|
|
585
|
+
document.getElementById('tagInput').focus();
|
|
586
|
+
}
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// Tag input handler
|
|
591
|
+
var tagInput = document.getElementById('tagInput');
|
|
592
|
+
if (tagInput) {
|
|
593
|
+
tagInput.onkeydown = function(e) {
|
|
594
|
+
if (e.key === 'Enter') {
|
|
595
|
+
e.preventDefault();
|
|
596
|
+
var newTag = this.value.trim();
|
|
597
|
+
if (newTag && currentTags.indexOf(newTag) === -1) {
|
|
598
|
+
currentTags.push(newTag);
|
|
599
|
+
renderTags();
|
|
600
|
+
}
|
|
601
|
+
this.value = '';
|
|
602
|
+
}
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// Predefined tag click handlers
|
|
607
|
+
document.querySelectorAll('.predefined-tag-btn').forEach(function(btn) {
|
|
608
|
+
btn.onclick = function() {
|
|
609
|
+
var tag = this.getAttribute('data-tag');
|
|
610
|
+
if (tag && currentTags.indexOf(tag) === -1) {
|
|
611
|
+
currentTags.push(tag);
|
|
612
|
+
renderTags();
|
|
613
|
+
}
|
|
614
|
+
};
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
// Initialize tags display
|
|
618
|
+
renderTags();
|
|
619
|
+
// Initialize lucide icons for predefined buttons
|
|
620
|
+
if (window.lucide) lucide.createIcons();
|
|
621
|
+
|
|
295
622
|
// Toggle Enable/Disable
|
|
296
623
|
var toggleBtn = document.getElementById('toggleEnableBtn');
|
|
297
624
|
if (toggleBtn) {
|
|
@@ -377,10 +704,15 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
|
|
|
377
704
|
try {
|
|
378
705
|
await updateCliToolConfig(tool, {
|
|
379
706
|
primaryModel: primaryModel,
|
|
380
|
-
secondaryModel: secondaryModel
|
|
707
|
+
secondaryModel: secondaryModel,
|
|
708
|
+
tags: currentTags
|
|
381
709
|
});
|
|
710
|
+
// Reload config to reflect changes
|
|
711
|
+
await loadCliToolConfig();
|
|
382
712
|
showRefreshToast('Configuration saved', 'success');
|
|
383
713
|
closeModal();
|
|
714
|
+
renderToolsSection();
|
|
715
|
+
if (window.lucide) lucide.createIcons();
|
|
384
716
|
} catch (err) {
|
|
385
717
|
showRefreshToast('Failed to save: ' + err.message, 'error');
|
|
386
718
|
}
|
|
@@ -392,26 +724,50 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
|
|
|
392
724
|
}
|
|
393
725
|
|
|
394
726
|
// ========== Rendering ==========
|
|
395
|
-
async function renderCliManager() {
|
|
396
|
-
var container = document.getElementById('mainContent');
|
|
397
|
-
if (!container) return;
|
|
398
727
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
728
|
+
/**
|
|
729
|
+
* 构建 CLI Manager 骨架屏
|
|
730
|
+
* @returns {string} HTML 字符串
|
|
731
|
+
*/
|
|
732
|
+
function buildCliManagerSkeleton() {
|
|
733
|
+
return '<div class="space-y-6">' +
|
|
734
|
+
'<div class="flex items-center justify-between mb-4">' +
|
|
735
|
+
'<h2 class="text-lg font-semibold">' + (t('title.cliTools') || 'CLI Tools & CCW') + '</h2>' +
|
|
736
|
+
'</div>' +
|
|
737
|
+
'<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">' +
|
|
738
|
+
// 左侧 Tools 区域骨架
|
|
739
|
+
'<div class="card p-4">' +
|
|
740
|
+
'<div class="animate-pulse space-y-4">' +
|
|
741
|
+
'<div class="h-4 bg-muted rounded w-1/3"></div>' +
|
|
742
|
+
'<div class="h-16 bg-muted rounded"></div>' +
|
|
743
|
+
'<div class="h-16 bg-muted rounded"></div>' +
|
|
744
|
+
'<div class="h-16 bg-muted rounded"></div>' +
|
|
745
|
+
'</div>' +
|
|
746
|
+
'</div>' +
|
|
747
|
+
// 右侧 CCW 区域骨架
|
|
748
|
+
'<div class="card p-4">' +
|
|
749
|
+
'<div class="animate-pulse space-y-4">' +
|
|
750
|
+
'<div class="h-4 bg-muted rounded w-1/3"></div>' +
|
|
751
|
+
'<div class="h-20 bg-muted rounded"></div>' +
|
|
752
|
+
'<div class="h-20 bg-muted rounded"></div>' +
|
|
753
|
+
'</div>' +
|
|
754
|
+
'</div>' +
|
|
755
|
+
'</div>' +
|
|
756
|
+
// 底部区域骨架
|
|
757
|
+
'<div class="card p-4">' +
|
|
758
|
+
'<div class="animate-pulse space-y-4">' +
|
|
759
|
+
'<div class="h-4 bg-muted rounded w-1/4"></div>' +
|
|
760
|
+
'<div class="h-12 bg-muted rounded"></div>' +
|
|
761
|
+
'</div>' +
|
|
762
|
+
'</div>' +
|
|
763
|
+
'</div>';
|
|
764
|
+
}
|
|
414
765
|
|
|
766
|
+
/**
|
|
767
|
+
* 渲染 CLI Manager 实际内容(内部容器结构 + 各子面板)
|
|
768
|
+
* @param {HTMLElement} container - 主容器元素
|
|
769
|
+
*/
|
|
770
|
+
function renderCliManagerContent(container) {
|
|
415
771
|
container.innerHTML = '<div class="status-manager">' +
|
|
416
772
|
'<div class="status-two-column">' +
|
|
417
773
|
'<div class="cli-section" id="tools-section"></div>' +
|
|
@@ -423,22 +779,89 @@ async function renderCliManager() {
|
|
|
423
779
|
'</div>' +
|
|
424
780
|
'<section id="storageCard" class="mb-6"></section>';
|
|
425
781
|
|
|
426
|
-
//
|
|
782
|
+
// 渲染子面板
|
|
427
783
|
renderToolsSection();
|
|
428
784
|
renderCcwSection();
|
|
429
785
|
renderLanguageSettingsSection();
|
|
430
786
|
renderCliSettingsSection();
|
|
431
787
|
renderCcwEndpointToolsSection();
|
|
432
788
|
|
|
433
|
-
//
|
|
789
|
+
// 初始化存储管理器卡片
|
|
434
790
|
if (typeof initStorageManager === 'function') {
|
|
435
791
|
initStorageManager();
|
|
436
792
|
}
|
|
437
793
|
|
|
438
|
-
//
|
|
794
|
+
// 初始化 Lucide 图标
|
|
439
795
|
if (window.lucide) lucide.createIcons();
|
|
440
796
|
}
|
|
441
797
|
|
|
798
|
+
async function renderCliManager() {
|
|
799
|
+
var container = document.getElementById('mainContent');
|
|
800
|
+
if (!container) return;
|
|
801
|
+
|
|
802
|
+
// 隐藏统计网格和搜索框
|
|
803
|
+
var statsGrid = document.getElementById('statsGrid');
|
|
804
|
+
var searchInput = document.getElementById('searchInput');
|
|
805
|
+
if (statsGrid) statsGrid.style.display = 'none';
|
|
806
|
+
if (searchInput) searchInput.parentElement.style.display = 'none';
|
|
807
|
+
|
|
808
|
+
// 注册数据源(如果尚未注册)
|
|
809
|
+
registerCliDataSources();
|
|
810
|
+
|
|
811
|
+
// 1. 立即显示骨架屏
|
|
812
|
+
container.innerHTML = buildCliManagerSkeleton();
|
|
813
|
+
if (window.lucide) lucide.createIcons();
|
|
814
|
+
|
|
815
|
+
// 2. 尝试从缓存渲染(快速展示)
|
|
816
|
+
var cachedConfig = getCliCachedData('toolConfig');
|
|
817
|
+
var cachedStatus = getCliCachedData('toolStatus');
|
|
818
|
+
var hasCachedData = cachedConfig && cachedStatus;
|
|
819
|
+
|
|
820
|
+
if (hasCachedData) {
|
|
821
|
+
// 应用缓存数据
|
|
822
|
+
cliToolConfig = cachedConfig.config;
|
|
823
|
+
predefinedModels = cachedConfig.predefinedModels || {};
|
|
824
|
+
// 立即渲染缓存数据
|
|
825
|
+
renderCliManagerContent(container);
|
|
826
|
+
console.log('[CLI Manager] Rendered from cache');
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
// 3. 后台加载最新数据
|
|
830
|
+
try {
|
|
831
|
+
await Promise.all([
|
|
832
|
+
loadCliToolsConfig(),
|
|
833
|
+
loadCliToolStatus(),
|
|
834
|
+
loadCodexLensStatus(),
|
|
835
|
+
loadCcwInstallations(),
|
|
836
|
+
loadCcwEndpointTools(),
|
|
837
|
+
loadLitellmApiEndpoints(),
|
|
838
|
+
loadCliCustomEndpoints(),
|
|
839
|
+
loadCliWrapperEndpoints()
|
|
840
|
+
]);
|
|
841
|
+
|
|
842
|
+
// 4. 用最新数据更新 UI(如果之前未渲染或数据有变化)
|
|
843
|
+
renderCliManagerContent(container);
|
|
844
|
+
console.log('[CLI Manager] Rendered with fresh data');
|
|
845
|
+
} catch (err) {
|
|
846
|
+
console.error('[CLI Manager] Failed to load data:', err);
|
|
847
|
+
// 如果没有缓存数据且加载失败,显示错误提示
|
|
848
|
+
if (!hasCachedData) {
|
|
849
|
+
container.innerHTML = '<div class="card p-4 text-center">' +
|
|
850
|
+
'<i data-lucide="alert-circle" class="w-8 h-8 text-muted-foreground mx-auto mb-2"></i>' +
|
|
851
|
+
'<p class="text-muted-foreground">' + (t('common.loadFailed') || 'Failed to load data') + '</p>' +
|
|
852
|
+
'<button class="btn btn-sm mt-2" onclick="renderCliManager()">' +
|
|
853
|
+
'<i data-lucide="refresh-cw" class="w-3 h-3 mr-1"></i>' +
|
|
854
|
+
(t('common.retry') || 'Retry') +
|
|
855
|
+
'</button>' +
|
|
856
|
+
'</div>';
|
|
857
|
+
if (window.lucide) lucide.createIcons();
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
// 同步活动执行
|
|
862
|
+
syncActiveExecutions();
|
|
863
|
+
}
|
|
864
|
+
|
|
442
865
|
// ========== Helper Functions ==========
|
|
443
866
|
|
|
444
867
|
/**
|
|
@@ -502,77 +925,48 @@ function renderToolsSection() {
|
|
|
502
925
|
var toolDescriptions = {
|
|
503
926
|
gemini: t('cli.geminiDesc'),
|
|
504
927
|
qwen: t('cli.qwenDesc'),
|
|
505
|
-
codex: t('cli.codexDesc')
|
|
928
|
+
codex: t('cli.codexDesc'),
|
|
929
|
+
claude: t('cli.claudeDesc') || 'Anthropic Claude Code CLI for AI-assisted development',
|
|
930
|
+
opencode: t('cli.opencodeDesc') || 'OpenCode CLI - Multi-provider AI coding assistant'
|
|
506
931
|
};
|
|
507
932
|
|
|
508
|
-
var tools = ['gemini', 'qwen', 'codex'];
|
|
933
|
+
var tools = ['gemini', 'qwen', 'codex', 'claude', 'opencode'];
|
|
509
934
|
var available = Object.values(cliToolStatus).filter(function(t) { return t.available; }).length;
|
|
510
935
|
|
|
511
936
|
var toolsHtml = tools.map(function(tool) {
|
|
512
937
|
var status = cliToolStatus[tool] || {};
|
|
513
938
|
var isAvailable = status.available;
|
|
514
|
-
var
|
|
939
|
+
var toolConfig = cliToolConfig && cliToolConfig.tools ? cliToolConfig.tools[tool] : null;
|
|
940
|
+
var tags = toolConfig && toolConfig.tags ? toolConfig.tags : [];
|
|
941
|
+
|
|
942
|
+
// Build tags HTML with color classes
|
|
943
|
+
var tagsHtml = tags.length > 0
|
|
944
|
+
? '<div class="tool-tags">' + tags.map(function(tag) {
|
|
945
|
+
return '<span class="tool-tag tag-' + escapeHtml(tag) + '">' + escapeHtml(tag) + '</span>';
|
|
946
|
+
}).join('') + '</div>'
|
|
947
|
+
: '';
|
|
515
948
|
|
|
516
949
|
return '<div class="tool-item clickable ' + (isAvailable ? 'available' : 'unavailable') + '" onclick="showToolConfigModal(\'' + tool + '\')">' +
|
|
517
950
|
'<div class="tool-item-left">' +
|
|
518
951
|
'<span class="tool-status-dot ' + (isAvailable ? 'status-available' : 'status-unavailable') + '"></span>' +
|
|
519
952
|
'<div class="tool-item-info">' +
|
|
520
953
|
'<div class="tool-item-name">' + tool.charAt(0).toUpperCase() + tool.slice(1) +
|
|
521
|
-
(isDefault ? '<span class="tool-default-badge">' + t('cli.default') + '</span>' : '') +
|
|
522
954
|
'<i data-lucide="settings" class="w-3 h-3 tool-config-icon"></i>' +
|
|
523
955
|
'</div>' +
|
|
524
956
|
'<div class="tool-item-desc">' + toolDescriptions[tool] + '</div>' +
|
|
957
|
+
tagsHtml +
|
|
525
958
|
'</div>' +
|
|
526
959
|
'</div>' +
|
|
527
960
|
'<div class="tool-item-right">' +
|
|
528
961
|
(isAvailable
|
|
529
962
|
? '<span class="tool-status-text success"><i data-lucide="check-circle" class="w-3.5 h-3.5"></i> ' + t('cli.ready') + '</span>'
|
|
530
963
|
: '<span class="tool-status-text muted"><i data-lucide="circle-dashed" class="w-3.5 h-3.5"></i> ' + t('cli.notInstalled') + '</span>') +
|
|
531
|
-
(isAvailable && !isDefault
|
|
532
|
-
? '<button class="btn-sm btn-outline" onclick="event.stopPropagation(); setDefaultCliTool(\'' + tool + '\')"><i data-lucide="star" class="w-3 h-3"></i> ' + t('cli.setDefault') + '</button>'
|
|
533
|
-
: '') +
|
|
534
964
|
'</div>' +
|
|
535
965
|
'</div>';
|
|
536
966
|
}).join('');
|
|
537
967
|
|
|
538
|
-
// CodexLens
|
|
539
|
-
|
|
540
|
-
'<div class="tool-item-left">' +
|
|
541
|
-
'<span class="tool-status-dot ' + (codexLensStatus.ready ? 'status-available' : 'status-unavailable') + '"></span>' +
|
|
542
|
-
'<div class="tool-item-info">' +
|
|
543
|
-
'<div class="tool-item-name">CodexLens <span class="tool-type-badge">Index</span>' +
|
|
544
|
-
'<i data-lucide="external-link" class="w-3 h-3 tool-config-icon"></i></div>' +
|
|
545
|
-
'<div class="tool-item-desc">' + (codexLensStatus.ready ? t('cli.codexLensDesc') : t('cli.codexLensDescFull')) + '</div>' +
|
|
546
|
-
'</div>' +
|
|
547
|
-
'</div>' +
|
|
548
|
-
'<div class="tool-item-right">' +
|
|
549
|
-
(codexLensStatus.ready
|
|
550
|
-
? '<span class="tool-status-text success"><i data-lucide="check-circle" class="w-3.5 h-3.5"></i> v' + (codexLensStatus.version || 'installed') + '</span>' +
|
|
551
|
-
'<button class="btn-sm btn-primary" onclick="event.stopPropagation(); navigateToCodexLensManager()"><i data-lucide="settings" class="w-3 h-3"></i> ' + t('cli.openManager') + '</button>'
|
|
552
|
-
: '<span class="tool-status-text muted"><i data-lucide="circle-dashed" class="w-3.5 h-3.5"></i> ' + t('cli.notInstalled') + '</span>' +
|
|
553
|
-
'<button class="btn-sm btn-primary" onclick="event.stopPropagation(); navigateToCodexLensManager()"><i data-lucide="settings" class="w-3 h-3"></i> ' + t('cli.openManager') + '</button>') +
|
|
554
|
-
'</div>' +
|
|
555
|
-
'</div>';
|
|
556
|
-
|
|
557
|
-
// Semantic Search item (only show if CodexLens is installed)
|
|
558
|
-
var semanticHtml = '';
|
|
559
|
-
if (codexLensStatus.ready) {
|
|
560
|
-
semanticHtml = '<div class="tool-item ' + (semanticStatus.available ? 'available' : 'unavailable') + '">' +
|
|
561
|
-
'<div class="tool-item-left">' +
|
|
562
|
-
'<span class="tool-status-dot ' + (semanticStatus.available ? 'status-available' : 'status-unavailable') + '"></span>' +
|
|
563
|
-
'<div class="tool-item-info">' +
|
|
564
|
-
'<div class="tool-item-name">Semantic Search <span class="tool-type-badge ai">AI</span></div>' +
|
|
565
|
-
'<div class="tool-item-desc">' + (semanticStatus.available ? 'AI-powered code understanding' : 'Natural language code search') + '</div>' +
|
|
566
|
-
'</div>' +
|
|
567
|
-
'</div>' +
|
|
568
|
-
'<div class="tool-item-right">' +
|
|
569
|
-
(semanticStatus.available
|
|
570
|
-
? '<span class="tool-status-text success"><i data-lucide="sparkles" class="w-3.5 h-3.5"></i> ' + (semanticStatus.backend || 'Ready') + '</span>'
|
|
571
|
-
: '<span class="tool-status-text muted"><i data-lucide="circle-dashed" class="w-3.5 h-3.5"></i> Not Installed</span>' +
|
|
572
|
-
'<button class="btn-sm btn-primary" onclick="event.stopPropagation(); openSemanticInstallWizard()"><i data-lucide="brain" class="w-3 h-3"></i> Install</button>') +
|
|
573
|
-
'</div>' +
|
|
574
|
-
'</div>';
|
|
575
|
-
}
|
|
968
|
+
// CodexLens and Semantic Search removed from this list
|
|
969
|
+
// They are managed in the dedicated CodexLens Manager page (left menu)
|
|
576
970
|
|
|
577
971
|
// API Endpoints section
|
|
578
972
|
var apiEndpointsHtml = '';
|
|
@@ -619,6 +1013,45 @@ function renderToolsSection() {
|
|
|
619
1013
|
'</div>';
|
|
620
1014
|
}
|
|
621
1015
|
|
|
1016
|
+
// CLI Wrapper (CLI封装) section
|
|
1017
|
+
var cliWrapperHtml = '';
|
|
1018
|
+
if (cliWrapperEndpoints.length > 0) {
|
|
1019
|
+
var wrapperItems = cliWrapperEndpoints.map(function(endpoint) {
|
|
1020
|
+
var isEnabled = endpoint.enabled !== false;
|
|
1021
|
+
var desc = endpoint.description || (t('cli.customClaudeSettings') || 'Custom Claude CLI settings');
|
|
1022
|
+
// Show command hint with name for easy copying
|
|
1023
|
+
var commandHint = 'ccw cli --tool ' + endpoint.name;
|
|
1024
|
+
|
|
1025
|
+
return '<div class="tool-item clickable ' + (isEnabled ? 'available' : 'unavailable') + '" onclick="navigateToApiSettings(\'' + endpoint.id + '\')">' +
|
|
1026
|
+
'<div class="tool-item-left">' +
|
|
1027
|
+
'<span class="tool-status-dot ' + (isEnabled ? 'status-available' : 'status-unavailable') + '"></span>' +
|
|
1028
|
+
'<div class="tool-item-info">' +
|
|
1029
|
+
'<div class="tool-item-name">' + escapeHtml(endpoint.name) + ' <span class="tool-type-badge" style="background: var(--primary); color: white;">' + (t('cli.wrapper') || 'Wrapper') + '</span></div>' +
|
|
1030
|
+
'<div class="tool-item-desc">' + escapeHtml(desc) + '</div>' +
|
|
1031
|
+
'<div class="tool-item-command" style="font-family: var(--font-mono); font-size: 0.7rem; color: var(--muted-foreground); margin-top: 0.25rem;">' + escapeHtml(commandHint) + '</div>' +
|
|
1032
|
+
'</div>' +
|
|
1033
|
+
'</div>' +
|
|
1034
|
+
'<div class="tool-item-right">' +
|
|
1035
|
+
'<label class="toggle-switch" onclick="event.stopPropagation()">' +
|
|
1036
|
+
'<input type="checkbox" ' + (isEnabled ? 'checked' : '') + ' onchange="toggleCliWrapperEnabled(\'' + endpoint.id + '\', this.checked); renderToolsSection();">' +
|
|
1037
|
+
'<span class="toggle-slider"></span>' +
|
|
1038
|
+
'</label>' +
|
|
1039
|
+
'</div>' +
|
|
1040
|
+
'</div>';
|
|
1041
|
+
}).join('');
|
|
1042
|
+
|
|
1043
|
+
var enabledCount = cliWrapperEndpoints.filter(function(e) { return e.enabled !== false; }).length;
|
|
1044
|
+
cliWrapperHtml = '<div class="tools-subsection" style="margin-top: 1rem; padding-top: 1rem; border-top: 1px solid var(--border);">' +
|
|
1045
|
+
'<div class="section-header-left" style="margin-bottom: 0.5rem;">' +
|
|
1046
|
+
'<h4 style="font-size: 0.875rem; font-weight: 600; display: flex; align-items: center; gap: 0.5rem;">' +
|
|
1047
|
+
'<i data-lucide="package-2" class="w-4 h-4"></i> ' + (t('cli.cliWrapper') || 'CLI Wrapper') +
|
|
1048
|
+
'</h4>' +
|
|
1049
|
+
'<span class="section-count">' + enabledCount + '/' + cliWrapperEndpoints.length + ' ' + (t('cli.enabled') || 'enabled') + '</span>' +
|
|
1050
|
+
'</div>' +
|
|
1051
|
+
'<div class="tools-list">' + wrapperItems + '</div>' +
|
|
1052
|
+
'</div>';
|
|
1053
|
+
}
|
|
1054
|
+
|
|
622
1055
|
container.innerHTML = '<div class="section-header">' +
|
|
623
1056
|
'<div class="section-header-left">' +
|
|
624
1057
|
'<h3><i data-lucide="terminal" class="w-4 h-4"></i> ' + t('cli.tools') + '</h3>' +
|
|
@@ -630,14 +1063,34 @@ function renderToolsSection() {
|
|
|
630
1063
|
'</div>' +
|
|
631
1064
|
'<div class="tools-list">' +
|
|
632
1065
|
toolsHtml +
|
|
633
|
-
codexLensHtml +
|
|
634
|
-
semanticHtml +
|
|
635
1066
|
'</div>' +
|
|
636
|
-
apiEndpointsHtml
|
|
1067
|
+
apiEndpointsHtml +
|
|
1068
|
+
cliWrapperHtml;
|
|
637
1069
|
|
|
638
1070
|
if (window.lucide) lucide.createIcons();
|
|
639
1071
|
}
|
|
640
1072
|
|
|
1073
|
+
/**
|
|
1074
|
+
* Navigate to API Settings page and open the CLI wrapper endpoint for editing
|
|
1075
|
+
*/
|
|
1076
|
+
function navigateToApiSettings(endpointId) {
|
|
1077
|
+
// Store the endpoint ID to edit after navigation
|
|
1078
|
+
window.pendingCliWrapperEdit = endpointId;
|
|
1079
|
+
|
|
1080
|
+
var navItem = document.querySelector('.nav-item[data-view="api-settings"]');
|
|
1081
|
+
if (navItem) {
|
|
1082
|
+
navItem.click();
|
|
1083
|
+
} else {
|
|
1084
|
+
// Fallback: try to render directly
|
|
1085
|
+
if (typeof renderApiSettings === 'function') {
|
|
1086
|
+
currentView = 'api-settings';
|
|
1087
|
+
renderApiSettings();
|
|
1088
|
+
} else {
|
|
1089
|
+
showRefreshToast(t('common.error') + ': API Settings not available', 'error');
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
|
|
641
1094
|
// ========== CCW Section (Right Column) ==========
|
|
642
1095
|
function renderCcwSection() {
|
|
643
1096
|
var container = document.getElementById('ccw-section');
|
|
@@ -713,6 +1166,8 @@ function renderCcwSection() {
|
|
|
713
1166
|
// ========== Language Settings State ==========
|
|
714
1167
|
var chineseResponseEnabled = false;
|
|
715
1168
|
var chineseResponseLoading = false;
|
|
1169
|
+
var codexChineseResponseEnabled = false;
|
|
1170
|
+
var codexChineseResponseLoading = false;
|
|
716
1171
|
var windowsPlatformEnabled = false;
|
|
717
1172
|
var windowsPlatformLoading = false;
|
|
718
1173
|
|
|
@@ -722,12 +1177,14 @@ async function loadLanguageSettings() {
|
|
|
722
1177
|
var response = await fetch('/api/language/chinese-response');
|
|
723
1178
|
if (!response.ok) throw new Error('Failed to load language settings');
|
|
724
1179
|
var data = await response.json();
|
|
725
|
-
chineseResponseEnabled = data.enabled || false;
|
|
1180
|
+
chineseResponseEnabled = data.claudeEnabled || data.enabled || false;
|
|
1181
|
+
codexChineseResponseEnabled = data.codexEnabled || false;
|
|
726
1182
|
return data;
|
|
727
1183
|
} catch (err) {
|
|
728
1184
|
console.error('Failed to load language settings:', err);
|
|
729
1185
|
chineseResponseEnabled = false;
|
|
730
|
-
|
|
1186
|
+
codexChineseResponseEnabled = false;
|
|
1187
|
+
return { claudeEnabled: false, codexEnabled: false, guidelinesExists: false };
|
|
731
1188
|
}
|
|
732
1189
|
}
|
|
733
1190
|
|
|
@@ -745,8 +1202,13 @@ async function loadWindowsPlatformSettings() {
|
|
|
745
1202
|
}
|
|
746
1203
|
}
|
|
747
1204
|
|
|
748
|
-
async function toggleChineseResponse(enabled) {
|
|
749
|
-
|
|
1205
|
+
async function toggleChineseResponse(enabled, target) {
|
|
1206
|
+
// target: 'claude' (default) or 'codex'
|
|
1207
|
+
target = target || 'claude';
|
|
1208
|
+
var isCodex = target === 'codex';
|
|
1209
|
+
var loadingVar = isCodex ? 'codexChineseResponseLoading' : 'chineseResponseLoading';
|
|
1210
|
+
|
|
1211
|
+
if (isCodex ? codexChineseResponseLoading : chineseResponseLoading) return;
|
|
750
1212
|
|
|
751
1213
|
// Pre-check: verify CCW workflows are installed (only when enabling)
|
|
752
1214
|
if (enabled && typeof ccwInstallStatus !== 'undefined' && !ccwInstallStatus.installed) {
|
|
@@ -757,13 +1219,17 @@ async function toggleChineseResponse(enabled) {
|
|
|
757
1219
|
}
|
|
758
1220
|
}
|
|
759
1221
|
|
|
760
|
-
|
|
1222
|
+
if (isCodex) {
|
|
1223
|
+
codexChineseResponseLoading = true;
|
|
1224
|
+
} else {
|
|
1225
|
+
chineseResponseLoading = true;
|
|
1226
|
+
}
|
|
761
1227
|
|
|
762
1228
|
try {
|
|
763
1229
|
var response = await fetch('/api/language/chinese-response', {
|
|
764
1230
|
method: 'POST',
|
|
765
1231
|
headers: { 'Content-Type': 'application/json' },
|
|
766
|
-
body: JSON.stringify({ enabled: enabled })
|
|
1232
|
+
body: JSON.stringify({ enabled: enabled, target: target })
|
|
767
1233
|
});
|
|
768
1234
|
|
|
769
1235
|
if (!response.ok) {
|
|
@@ -779,18 +1245,27 @@ async function toggleChineseResponse(enabled) {
|
|
|
779
1245
|
}
|
|
780
1246
|
|
|
781
1247
|
var data = await response.json();
|
|
782
|
-
|
|
1248
|
+
if (isCodex) {
|
|
1249
|
+
codexChineseResponseEnabled = data.enabled;
|
|
1250
|
+
} else {
|
|
1251
|
+
chineseResponseEnabled = data.enabled;
|
|
1252
|
+
}
|
|
783
1253
|
|
|
784
1254
|
// Update UI
|
|
785
1255
|
renderLanguageSettingsSection();
|
|
786
1256
|
|
|
787
1257
|
// Show toast
|
|
788
|
-
|
|
1258
|
+
var toolName = isCodex ? 'Codex' : 'Claude';
|
|
1259
|
+
showRefreshToast(toolName + ': ' + (enabled ? t('lang.enableSuccess') : t('lang.disableSuccess')), 'success');
|
|
789
1260
|
} catch (err) {
|
|
790
1261
|
console.error('Failed to toggle Chinese response:', err);
|
|
791
1262
|
// Error already shown in the !response.ok block
|
|
792
1263
|
} finally {
|
|
793
|
-
|
|
1264
|
+
if (isCodex) {
|
|
1265
|
+
codexChineseResponseLoading = false;
|
|
1266
|
+
} else {
|
|
1267
|
+
chineseResponseLoading = false;
|
|
1268
|
+
}
|
|
794
1269
|
}
|
|
795
1270
|
}
|
|
796
1271
|
|
|
@@ -848,7 +1323,7 @@ async function renderLanguageSettingsSection() {
|
|
|
848
1323
|
if (!container) return;
|
|
849
1324
|
|
|
850
1325
|
// Load current state if not loaded
|
|
851
|
-
if (!chineseResponseEnabled && !chineseResponseLoading) {
|
|
1326
|
+
if (!chineseResponseEnabled && !codexChineseResponseEnabled && !chineseResponseLoading) {
|
|
852
1327
|
await loadLanguageSettings();
|
|
853
1328
|
}
|
|
854
1329
|
if (!windowsPlatformEnabled && !windowsPlatformLoading) {
|
|
@@ -861,22 +1336,41 @@ async function renderLanguageSettingsSection() {
|
|
|
861
1336
|
'</div>' +
|
|
862
1337
|
'</div>' +
|
|
863
1338
|
'<div class="cli-settings-grid" style="grid-template-columns: 1fr 1fr;">' +
|
|
1339
|
+
// Chinese Response - Claude
|
|
864
1340
|
'<div class="cli-setting-item">' +
|
|
865
1341
|
'<label class="cli-setting-label">' +
|
|
866
1342
|
'<i data-lucide="message-square-text" class="w-3 h-3"></i>' +
|
|
867
|
-
t('lang.chinese') +
|
|
1343
|
+
t('lang.chinese') + ' <span class="badge badge-sm badge-primary">Claude</span>' +
|
|
868
1344
|
'</label>' +
|
|
869
1345
|
'<div class="cli-setting-control">' +
|
|
870
1346
|
'<label class="cli-toggle">' +
|
|
871
|
-
'<input type="checkbox"' + (chineseResponseEnabled ? ' checked' : '') + ' onchange="toggleChineseResponse(this.checked)"' + (chineseResponseLoading ? ' disabled' : '') + '>' +
|
|
1347
|
+
'<input type="checkbox"' + (chineseResponseEnabled ? ' checked' : '') + ' onchange="toggleChineseResponse(this.checked, \'claude\')"' + (chineseResponseLoading ? ' disabled' : '') + '>' +
|
|
872
1348
|
'<span class="cli-toggle-slider"></span>' +
|
|
873
1349
|
'</label>' +
|
|
874
1350
|
'<span class="cli-setting-status ' + (chineseResponseEnabled ? 'enabled' : 'disabled') + '">' +
|
|
875
1351
|
(chineseResponseEnabled ? t('lang.enabled') : t('lang.disabled')) +
|
|
876
1352
|
'</span>' +
|
|
877
1353
|
'</div>' +
|
|
878
|
-
'<p class="cli-setting-desc">' + t('lang.
|
|
1354
|
+
'<p class="cli-setting-desc">' + t('lang.chineseDescClaude') + '</p>' +
|
|
1355
|
+
'</div>' +
|
|
1356
|
+
// Chinese Response - Codex
|
|
1357
|
+
'<div class="cli-setting-item">' +
|
|
1358
|
+
'<label class="cli-setting-label">' +
|
|
1359
|
+
'<i data-lucide="message-square-text" class="w-3 h-3"></i>' +
|
|
1360
|
+
t('lang.chinese') + ' <span class="badge badge-sm badge-secondary">Codex</span>' +
|
|
1361
|
+
'</label>' +
|
|
1362
|
+
'<div class="cli-setting-control">' +
|
|
1363
|
+
'<label class="cli-toggle">' +
|
|
1364
|
+
'<input type="checkbox"' + (codexChineseResponseEnabled ? ' checked' : '') + ' onchange="toggleChineseResponse(this.checked, \'codex\')"' + (codexChineseResponseLoading ? ' disabled' : '') + '>' +
|
|
1365
|
+
'<span class="cli-toggle-slider"></span>' +
|
|
1366
|
+
'</label>' +
|
|
1367
|
+
'<span class="cli-setting-status ' + (codexChineseResponseEnabled ? 'enabled' : 'disabled') + '">' +
|
|
1368
|
+
(codexChineseResponseEnabled ? t('lang.enabled') : t('lang.disabled')) +
|
|
1369
|
+
'</span>' +
|
|
1370
|
+
'</div>' +
|
|
1371
|
+
'<p class="cli-setting-desc">' + t('lang.chineseDescCodex') + '</p>' +
|
|
879
1372
|
'</div>' +
|
|
1373
|
+
// Windows Platform
|
|
880
1374
|
'<div class="cli-setting-item">' +
|
|
881
1375
|
'<label class="cli-setting-label">' +
|
|
882
1376
|
'<i data-lucide="monitor" class="w-3 h-3"></i>' +
|