agent-nuvira 1.14.0
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/LICENSE +21 -0
- package/README.md +891 -0
- package/dist/agent-sdk/src/agent.d.ts +118 -0
- package/dist/agent-sdk/src/agent.d.ts.map +1 -0
- package/dist/agent-sdk/src/agent.js +88 -0
- package/dist/agent-sdk/src/agent.js.map +1 -0
- package/dist/agent-sdk/src/index.d.ts +33 -0
- package/dist/agent-sdk/src/index.d.ts.map +1 -0
- package/dist/agent-sdk/src/index.js +32 -0
- package/dist/agent-sdk/src/index.js.map +1 -0
- package/dist/agent-sdk/src/register.d.ts +70 -0
- package/dist/agent-sdk/src/register.d.ts.map +1 -0
- package/dist/agent-sdk/src/register.js +181 -0
- package/dist/agent-sdk/src/register.js.map +1 -0
- package/dist/agent-sdk/src/scaffold.d.ts +50 -0
- package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
- package/dist/agent-sdk/src/scaffold.js +291 -0
- package/dist/agent-sdk/src/scaffold.js.map +1 -0
- package/dist/agent-sdk/src/testing.d.ts +187 -0
- package/dist/agent-sdk/src/testing.d.ts.map +1 -0
- package/dist/agent-sdk/src/testing.js +243 -0
- package/dist/agent-sdk/src/testing.js.map +1 -0
- package/dist/agent-sdk/src/types.d.ts +202 -0
- package/dist/agent-sdk/src/types.d.ts.map +1 -0
- package/dist/agent-sdk/src/types.js +11 -0
- package/dist/agent-sdk/src/types.js.map +1 -0
- package/dist/agents/agent.d.ts +132 -0
- package/dist/agents/agent.d.ts.map +1 -0
- package/dist/agents/agent.js +19 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agents/context-gatherer.d.ts +42 -0
- package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
- package/dist/agents/agents/context-gatherer.js +366 -0
- package/dist/agents/agents/context-gatherer.js.map +1 -0
- package/dist/agents/agents/debugger.d.ts +58 -0
- package/dist/agents/agents/debugger.d.ts.map +1 -0
- package/dist/agents/agents/debugger.js +257 -0
- package/dist/agents/agents/debugger.js.map +1 -0
- package/dist/agents/agents/git-agent.d.ts +34 -0
- package/dist/agents/agents/git-agent.d.ts.map +1 -0
- package/dist/agents/agents/git-agent.js +200 -0
- package/dist/agents/agents/git-agent.js.map +1 -0
- package/dist/agents/agents/github-release-agent.d.ts +65 -0
- package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
- package/dist/agents/agents/github-release-agent.js +439 -0
- package/dist/agents/agents/github-release-agent.js.map +1 -0
- package/dist/agents/agents/package-agent.d.ts +33 -0
- package/dist/agents/agents/package-agent.d.ts.map +1 -0
- package/dist/agents/agents/package-agent.js +233 -0
- package/dist/agents/agents/package-agent.js.map +1 -0
- package/dist/agents/agents/planner.d.ts +26 -0
- package/dist/agents/agents/planner.d.ts.map +1 -0
- package/dist/agents/agents/planner.js +222 -0
- package/dist/agents/agents/planner.js.map +1 -0
- package/dist/agents/agents/reviewer.d.ts +34 -0
- package/dist/agents/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/agents/reviewer.js +159 -0
- package/dist/agents/agents/reviewer.js.map +1 -0
- package/dist/agents/agents/runner.d.ts +73 -0
- package/dist/agents/agents/runner.d.ts.map +1 -0
- package/dist/agents/agents/runner.js +299 -0
- package/dist/agents/agents/runner.js.map +1 -0
- package/dist/agents/agents/security-agent.d.ts +33 -0
- package/dist/agents/agents/security-agent.d.ts.map +1 -0
- package/dist/agents/agents/security-agent.js +184 -0
- package/dist/agents/agents/security-agent.js.map +1 -0
- package/dist/agents/agents/tester.d.ts +96 -0
- package/dist/agents/agents/tester.d.ts.map +1 -0
- package/dist/agents/agents/tester.js +410 -0
- package/dist/agents/agents/tester.js.map +1 -0
- package/dist/agents/agents/writer.d.ts +51 -0
- package/dist/agents/agents/writer.d.ts.map +1 -0
- package/dist/agents/agents/writer.js +384 -0
- package/dist/agents/agents/writer.js.map +1 -0
- package/dist/agents/context-vault.d.ts +49 -0
- package/dist/agents/context-vault.d.ts.map +1 -0
- package/dist/agents/context-vault.js +134 -0
- package/dist/agents/context-vault.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +97 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +696 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/utils/file-tree.d.ts +28 -0
- package/dist/agents/utils/file-tree.d.ts.map +1 -0
- package/dist/agents/utils/file-tree.js +93 -0
- package/dist/agents/utils/file-tree.js.map +1 -0
- package/dist/cli/agent.d.ts +25 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +374 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/benchmark.d.ts +24 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +235 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/cache.d.ts +12 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +58 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/chat.d.ts +37 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +393 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/commands.d.ts +24 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +18 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +162 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dashboard.d.ts +34 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +126 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/doctor.d.ts +68 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +585 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/edit.d.ts +11 -0
- package/dist/cli/edit.d.ts.map +1 -0
- package/dist/cli/edit.js +86 -0
- package/dist/cli/edit.js.map +1 -0
- package/dist/cli/execute.d.ts +25 -0
- package/dist/cli/execute.d.ts.map +1 -0
- package/dist/cli/execute.js +186 -0
- package/dist/cli/execute.js.map +1 -0
- package/dist/cli/federation.d.ts +31 -0
- package/dist/cli/federation.d.ts.map +1 -0
- package/dist/cli/federation.js +387 -0
- package/dist/cli/federation.js.map +1 -0
- package/dist/cli/history.d.ts +22 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +140 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/init.d.ts +49 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +423 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/learn.d.ts +31 -0
- package/dist/cli/learn.d.ts.map +1 -0
- package/dist/cli/learn.js +320 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/memory.d.ts +38 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +295 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model-picker.d.ts +18 -0
- package/dist/cli/model-picker.d.ts.map +1 -0
- package/dist/cli/model-picker.js +225 -0
- package/dist/cli/model-picker.js.map +1 -0
- package/dist/cli/models.d.ts +11 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +132 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/plan.d.ts +11 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +94 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/plugins.d.ts +15 -0
- package/dist/cli/plugins.d.ts.map +1 -0
- package/dist/cli/plugins.js +123 -0
- package/dist/cli/plugins.js.map +1 -0
- package/dist/cli/router.d.ts +20 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +142 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +110 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/sandbox.d.ts +27 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +264 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sdk.d.ts +27 -0
- package/dist/cli/sdk.d.ts.map +1 -0
- package/dist/cli/sdk.js +204 -0
- package/dist/cli/sdk.js.map +1 -0
- package/dist/cli/stats.d.ts +18 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +78 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/team.d.ts +42 -0
- package/dist/cli/team.d.ts.map +1 -0
- package/dist/cli/team.js +473 -0
- package/dist/cli/team.js.map +1 -0
- package/dist/cli/workflow.d.ts +27 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +347 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/config/manager.d.ts +37 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +147 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +53 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context/cache.d.ts +27 -0
- package/dist/context/cache.d.ts.map +1 -0
- package/dist/context/cache.js +116 -0
- package/dist/context/cache.js.map +1 -0
- package/dist/context/history.d.ts +87 -0
- package/dist/context/history.d.ts.map +1 -0
- package/dist/context/history.js +249 -0
- package/dist/context/history.js.map +1 -0
- package/dist/context/parser.d.ts +61 -0
- package/dist/context/parser.d.ts.map +1 -0
- package/dist/context/parser.js +194 -0
- package/dist/context/parser.js.map +1 -0
- package/dist/federation/client.d.ts +49 -0
- package/dist/federation/client.d.ts.map +1 -0
- package/dist/federation/client.js +239 -0
- package/dist/federation/client.js.map +1 -0
- package/dist/federation/protocol.d.ts +155 -0
- package/dist/federation/protocol.d.ts.map +1 -0
- package/dist/federation/protocol.js +57 -0
- package/dist/federation/protocol.js.map +1 -0
- package/dist/federation/server.d.ts +25 -0
- package/dist/federation/server.d.ts.map +1 -0
- package/dist/federation/server.js +401 -0
- package/dist/federation/server.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/factory.d.ts +20 -0
- package/dist/inference/factory.d.ts.map +1 -0
- package/dist/inference/factory.js +46 -0
- package/dist/inference/factory.js.map +1 -0
- package/dist/inference/gemini-adapter.d.ts +17 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -0
- package/dist/inference/gemini-adapter.js +176 -0
- package/dist/inference/gemini-adapter.js.map +1 -0
- package/dist/inference/groq-adapter.d.ts +17 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -0
- package/dist/inference/groq-adapter.js +103 -0
- package/dist/inference/groq-adapter.js.map +1 -0
- package/dist/inference/interface.d.ts +49 -0
- package/dist/inference/interface.d.ts.map +1 -0
- package/dist/inference/interface.js +2 -0
- package/dist/inference/interface.js.map +1 -0
- package/dist/inference/local-adapter.d.ts +35 -0
- package/dist/inference/local-adapter.d.ts.map +1 -0
- package/dist/inference/local-adapter.js +311 -0
- package/dist/inference/local-adapter.js.map +1 -0
- package/dist/inference/model-catalog.d.ts +53 -0
- package/dist/inference/model-catalog.d.ts.map +1 -0
- package/dist/inference/model-catalog.js +306 -0
- package/dist/inference/model-catalog.js.map +1 -0
- package/dist/inference/nim-adapter.d.ts +17 -0
- package/dist/inference/nim-adapter.d.ts.map +1 -0
- package/dist/inference/nim-adapter.js +103 -0
- package/dist/inference/nim-adapter.js.map +1 -0
- package/dist/inference/openrouter-adapter.d.ts +17 -0
- package/dist/inference/openrouter-adapter.d.ts.map +1 -0
- package/dist/inference/openrouter-adapter.js +105 -0
- package/dist/inference/openrouter-adapter.js.map +1 -0
- package/dist/inference/sse.d.ts +20 -0
- package/dist/inference/sse.d.ts.map +1 -0
- package/dist/inference/sse.js +91 -0
- package/dist/inference/sse.js.map +1 -0
- package/dist/learning/agent-stats.d.ts +109 -0
- package/dist/learning/agent-stats.d.ts.map +1 -0
- package/dist/learning/agent-stats.js +240 -0
- package/dist/learning/agent-stats.js.map +1 -0
- package/dist/learning/benchmark.d.ts +161 -0
- package/dist/learning/benchmark.d.ts.map +1 -0
- package/dist/learning/benchmark.js +589 -0
- package/dist/learning/benchmark.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts +101 -0
- package/dist/learning/cost-tracker.d.ts.map +1 -0
- package/dist/learning/cost-tracker.js +224 -0
- package/dist/learning/cost-tracker.js.map +1 -0
- package/dist/learning/feedback.d.ts +88 -0
- package/dist/learning/feedback.d.ts.map +1 -0
- package/dist/learning/feedback.js +169 -0
- package/dist/learning/feedback.js.map +1 -0
- package/dist/learning/hybrid-router.d.ts +201 -0
- package/dist/learning/hybrid-router.d.ts.map +1 -0
- package/dist/learning/hybrid-router.js +450 -0
- package/dist/learning/hybrid-router.js.map +1 -0
- package/dist/learning/model-compare.d.ts +76 -0
- package/dist/learning/model-compare.d.ts.map +1 -0
- package/dist/learning/model-compare.js +252 -0
- package/dist/learning/model-compare.js.map +1 -0
- package/dist/learning/model-router.d.ts +68 -0
- package/dist/learning/model-router.d.ts.map +1 -0
- package/dist/learning/model-router.js +140 -0
- package/dist/learning/model-router.js.map +1 -0
- package/dist/learning/pattern-extractor.d.ts +99 -0
- package/dist/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/learning/pattern-extractor.js +310 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/learning/scorer.d.ts +51 -0
- package/dist/learning/scorer.d.ts.map +1 -0
- package/dist/learning/scorer.js +64 -0
- package/dist/learning/scorer.js.map +1 -0
- package/dist/learning/self-improver.d.ts +48 -0
- package/dist/learning/self-improver.d.ts.map +1 -0
- package/dist/learning/self-improver.js +161 -0
- package/dist/learning/self-improver.js.map +1 -0
- package/dist/memory/embedder.d.ts +65 -0
- package/dist/memory/embedder.d.ts.map +1 -0
- package/dist/memory/embedder.js +424 -0
- package/dist/memory/embedder.js.map +1 -0
- package/dist/memory/memory-integration.d.ts +56 -0
- package/dist/memory/memory-integration.d.ts.map +1 -0
- package/dist/memory/memory-integration.js +95 -0
- package/dist/memory/memory-integration.js.map +1 -0
- package/dist/memory/trajectory-store.d.ts +149 -0
- package/dist/memory/trajectory-store.d.ts.map +1 -0
- package/dist/memory/trajectory-store.js +476 -0
- package/dist/memory/trajectory-store.js.map +1 -0
- package/dist/memory/vector-store.d.ts +78 -0
- package/dist/memory/vector-store.d.ts.map +1 -0
- package/dist/memory/vector-store.js +186 -0
- package/dist/memory/vector-store.js.map +1 -0
- package/dist/plugins/agent-plugin.d.ts +73 -0
- package/dist/plugins/agent-plugin.d.ts.map +1 -0
- package/dist/plugins/agent-plugin.js +199 -0
- package/dist/plugins/agent-plugin.js.map +1 -0
- package/dist/plugins/registry.d.ts +61 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +67 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/sandbox/images.d.ts +31 -0
- package/dist/sandbox/images.d.ts.map +1 -0
- package/dist/sandbox/images.js +129 -0
- package/dist/sandbox/images.js.map +1 -0
- package/dist/sandbox/manager.d.ts +134 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +470 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/types.d.ts +113 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +107 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/security/scanner.d.ts +53 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +271 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/team/config.d.ts +50 -0
- package/dist/team/config.d.ts.map +1 -0
- package/dist/team/config.js +108 -0
- package/dist/team/config.js.map +1 -0
- package/dist/team/memory.d.ts +63 -0
- package/dist/team/memory.d.ts.map +1 -0
- package/dist/team/memory.js +282 -0
- package/dist/team/memory.js.map +1 -0
- package/dist/team/review.d.ts +123 -0
- package/dist/team/review.d.ts.map +1 -0
- package/dist/team/review.js +293 -0
- package/dist/team/review.js.map +1 -0
- package/dist/utils/env.d.ts +19 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +250 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/web-dashboard/server.d.ts +59 -0
- package/dist/web-dashboard/server.d.ts.map +1 -0
- package/dist/web-dashboard/server.js +418 -0
- package/dist/web-dashboard/server.js.map +1 -0
- package/dist/workflow/registry.d.ts +127 -0
- package/dist/workflow/registry.d.ts.map +1 -0
- package/dist/workflow/registry.js +482 -0
- package/dist/workflow/registry.js.map +1 -0
- package/dist/workflow/templates.d.ts +93 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +481 -0
- package/dist/workflow/templates.js.map +1 -0
- package/package.json +78 -0
- package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
- package/src/web-dashboard/public/index.html +13 -0
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor command — One-command diagnosis of all provider configurations.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* buff doctor — Run full health check on all providers
|
|
6
|
+
* buff doctor --provider groq — Check only a specific provider
|
|
7
|
+
* buff doctor --watch — Continuous monitoring mode (refreshes every 30s)
|
|
8
|
+
* buff doctor --verbose — Show detailed diagnostic info
|
|
9
|
+
* buff doctor --fix — Attempt auto-fix for common issues (create ~/.buff dirs, etc.)
|
|
10
|
+
*
|
|
11
|
+
* The health check runs all provider tests in parallel with timeouts:
|
|
12
|
+
* 1. API Key presence check
|
|
13
|
+
* 2. Endpoint reachability check
|
|
14
|
+
* 3. Provider availability check (isAvailable())
|
|
15
|
+
* 4. Model listing check
|
|
16
|
+
* 5. Quick generation test (optional, with --verbose)
|
|
17
|
+
*
|
|
18
|
+
* Each test returns a status: ✅ PASS, ⚠️ WARN, ❌ FAIL
|
|
19
|
+
* With fix suggestions for common failure modes.
|
|
20
|
+
*/
|
|
21
|
+
import { Command } from 'commander';
|
|
22
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
23
|
+
import { join } from 'node:path';
|
|
24
|
+
import { homedir } from 'node:os';
|
|
25
|
+
import { BaseCommand } from './commands.js';
|
|
26
|
+
import { ProviderFactory } from '../inference/factory.js';
|
|
27
|
+
import { getPluginRegistry } from '../plugins/registry.js';
|
|
28
|
+
import { logger } from '../utils/logger.js';
|
|
29
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
30
|
+
const PROVIDER_LABELS = {
|
|
31
|
+
local: '🐍 Local (Ollama / HuggingFace / GGML)',
|
|
32
|
+
groq: '⚡ Groq',
|
|
33
|
+
nim: '🎮 NVIDIA NIM',
|
|
34
|
+
gemini: '🌀 Google Gemini',
|
|
35
|
+
openrouter: '🌐 OpenRouter',
|
|
36
|
+
};
|
|
37
|
+
const BUILTIN_PROVIDERS = ['local', 'groq', 'nim', 'gemini', 'openrouter'];
|
|
38
|
+
const CHECK_TIMEOUT_MS = 10_000; // 10s per check
|
|
39
|
+
const TOTAL_TIMEOUT_MS = 30_000; // 30s total for all checks on one provider
|
|
40
|
+
// ─── DoctorCommand ──────────────────────────────────────────────────────────
|
|
41
|
+
export class DoctorCommand extends BaseCommand {
|
|
42
|
+
create() {
|
|
43
|
+
const command = new Command('doctor')
|
|
44
|
+
.description('Run diagnostic checks on all provider configurations and system health');
|
|
45
|
+
command
|
|
46
|
+
.option('-p, --provider <provider>', 'Check only a specific provider')
|
|
47
|
+
.option('--watch', 'Continuous monitoring mode (refreshes every 30s)', false)
|
|
48
|
+
.option('--verbose', 'Show detailed diagnostic information', false)
|
|
49
|
+
.option('--fix', 'Attempt to auto-fix common issues', false)
|
|
50
|
+
.action(async (options) => {
|
|
51
|
+
if (options?.watch) {
|
|
52
|
+
await this.runWatchMode(options);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
await this.runDiagnosis(options || {});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return command;
|
|
59
|
+
}
|
|
60
|
+
// ── Main Diagnosis ───────────────────────────────────────────────────────
|
|
61
|
+
async runDiagnosis(options) {
|
|
62
|
+
const startTime = Date.now();
|
|
63
|
+
// Header
|
|
64
|
+
logger.highlight('═'.repeat(62));
|
|
65
|
+
logger.highlight(' 🏥 Buff System Health Diagnosis');
|
|
66
|
+
logger.highlight('═'.repeat(62));
|
|
67
|
+
console.log('');
|
|
68
|
+
// ── System-level checks ─────────────────────────────────────────────
|
|
69
|
+
const sysChecks = await this.runSystemChecks();
|
|
70
|
+
// ── Provider checks ─────────────────────────────────────────────────
|
|
71
|
+
const providersToCheck = options.provider
|
|
72
|
+
? [options.provider]
|
|
73
|
+
: [...BUILTIN_PROVIDERS];
|
|
74
|
+
// Collect plugin providers too
|
|
75
|
+
const registry = getPluginRegistry();
|
|
76
|
+
const pluginTypes = registry.getAllPlugins().map((p) => p.getProviderType());
|
|
77
|
+
if (!options.provider) {
|
|
78
|
+
providersToCheck.push(...pluginTypes);
|
|
79
|
+
}
|
|
80
|
+
const providerResults = [];
|
|
81
|
+
for (const providerType of providersToCheck) {
|
|
82
|
+
const result = await this.checkProvider(providerType, options);
|
|
83
|
+
providerResults.push(result);
|
|
84
|
+
}
|
|
85
|
+
const durationMs = Date.now() - startTime;
|
|
86
|
+
// ── Render Report ───────────────────────────────────────────────────
|
|
87
|
+
console.log('');
|
|
88
|
+
this.renderSystemSection(sysChecks);
|
|
89
|
+
console.log('');
|
|
90
|
+
this.renderProviderSection(providerResults, options.verbose);
|
|
91
|
+
console.log('');
|
|
92
|
+
// ── Summary ─────────────────────────────────────────────────────────
|
|
93
|
+
this.renderSummary(sysChecks, providerResults);
|
|
94
|
+
console.log('');
|
|
95
|
+
// ── Fix mode ────────────────────────────────────────────────────────
|
|
96
|
+
if (options.fix) {
|
|
97
|
+
await this.autoFix(sysChecks, providerResults);
|
|
98
|
+
}
|
|
99
|
+
logger.highlight('═'.repeat(62));
|
|
100
|
+
console.log(` Completed in ${durationMs}ms`);
|
|
101
|
+
logger.highlight('═'.repeat(62));
|
|
102
|
+
console.log('');
|
|
103
|
+
return {
|
|
104
|
+
timestamp: Date.now(),
|
|
105
|
+
system: sysChecks,
|
|
106
|
+
providers: providerResults,
|
|
107
|
+
durationMs,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// ── Watch Mode ────────────────────────────────────────────────────────────
|
|
111
|
+
async runWatchMode(options) {
|
|
112
|
+
logger.info('Watch mode enabled. Refreshing every 30s. Press Ctrl+C to stop.\n');
|
|
113
|
+
const refresh = async () => {
|
|
114
|
+
// Clear previous output
|
|
115
|
+
console.clear();
|
|
116
|
+
await this.runDiagnosis(options);
|
|
117
|
+
};
|
|
118
|
+
await refresh();
|
|
119
|
+
// Continuous refresh
|
|
120
|
+
const interval = setInterval(refresh, 30_000);
|
|
121
|
+
// Handle Ctrl+C gracefully
|
|
122
|
+
process.on('SIGINT', () => {
|
|
123
|
+
clearInterval(interval);
|
|
124
|
+
logger.info('\nWatch mode stopped.');
|
|
125
|
+
process.exit(0);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// ── System Checks ─────────────────────────────────────────────────────────
|
|
129
|
+
async runSystemChecks() {
|
|
130
|
+
const checks = [];
|
|
131
|
+
// 1. Config directory
|
|
132
|
+
const buffDir = join(homedir(), '.buff');
|
|
133
|
+
checks.push({
|
|
134
|
+
name: 'Config Directory',
|
|
135
|
+
status: existsSync(buffDir) ? 'pass' : 'warn',
|
|
136
|
+
message: existsSync(buffDir)
|
|
137
|
+
? `~/.buff/ exists`
|
|
138
|
+
: `~/.buff/ not found`,
|
|
139
|
+
detail: existsSync(buffDir)
|
|
140
|
+
? `Path: ${buffDir}`
|
|
141
|
+
: `Run 'buff config' or create ~/.buff/ manually`,
|
|
142
|
+
fix: !existsSync(buffDir) ? 'Run `buff doctor --fix` to create required directories' : undefined,
|
|
143
|
+
});
|
|
144
|
+
// 2. Memory directory
|
|
145
|
+
const memoryDir = join(buffDir, 'memory');
|
|
146
|
+
const memoryExists = existsSync(memoryDir);
|
|
147
|
+
checks.push({
|
|
148
|
+
name: 'Memory Directory',
|
|
149
|
+
status: memoryExists ? 'pass' : 'warn',
|
|
150
|
+
message: memoryExists
|
|
151
|
+
? `~/.buff/memory/ exists`
|
|
152
|
+
: `~/.buff/memory/ not found (will be created on first use)`,
|
|
153
|
+
detail: `Path: ${memoryDir}`,
|
|
154
|
+
});
|
|
155
|
+
// 3. Docker availability (quick check)
|
|
156
|
+
try {
|
|
157
|
+
const dockerCheck = await this.checkDocker();
|
|
158
|
+
checks.push(dockerCheck);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
checks.push({
|
|
162
|
+
name: 'Docker',
|
|
163
|
+
status: 'warn',
|
|
164
|
+
message: 'Docker check skipped',
|
|
165
|
+
detail: 'Could not verify Docker installation',
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// 4. Plugin directories
|
|
169
|
+
const pluginDir = join(buffDir, 'plugins');
|
|
170
|
+
const agentDir = join(buffDir, 'agents');
|
|
171
|
+
const workflowDir = join(buffDir, 'workflows');
|
|
172
|
+
checks.push({
|
|
173
|
+
name: 'Plugin Directories',
|
|
174
|
+
status: 'pass',
|
|
175
|
+
message: `plugins/${existsSync(pluginDir) ? '✅' : '⏳'} agents/${existsSync(agentDir) ? '✅' : '⏳'} workflows/${existsSync(workflowDir) ? '✅' : '⏳'}`,
|
|
176
|
+
detail: `~/.buff/plugins/: ${existsSync(pluginDir) ? 'exists' : 'will create on first scan'}\n` +
|
|
177
|
+
`~/.buff/agents/: ${existsSync(agentDir) ? 'exists' : 'will create on first scan'}\n` +
|
|
178
|
+
`~/.buff/workflows/: ${existsSync(workflowDir) ? 'exists' : 'will create on first scan'}`,
|
|
179
|
+
});
|
|
180
|
+
// 5. Online connectivity check
|
|
181
|
+
try {
|
|
182
|
+
const onlineCheck = await this.checkConnectivity();
|
|
183
|
+
checks.push(onlineCheck);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
checks.push({
|
|
187
|
+
name: 'Internet Connectivity',
|
|
188
|
+
status: 'warn',
|
|
189
|
+
message: 'Connectivity check skipped',
|
|
190
|
+
detail: 'Could not verify internet access',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return checks;
|
|
194
|
+
}
|
|
195
|
+
async checkDocker() {
|
|
196
|
+
try {
|
|
197
|
+
const { getSandboxManager } = await import('../sandbox/manager.js');
|
|
198
|
+
const manager = getSandboxManager();
|
|
199
|
+
const available = await manager.isDockerAvailable();
|
|
200
|
+
return {
|
|
201
|
+
name: 'Docker',
|
|
202
|
+
status: available ? 'pass' : 'warn',
|
|
203
|
+
message: available ? 'Docker is available' : 'Docker is not available',
|
|
204
|
+
detail: available
|
|
205
|
+
? 'Sandbox mode can use Docker for isolated code execution'
|
|
206
|
+
: 'Code execution will use temp directories (less secure)',
|
|
207
|
+
fix: !available ? 'Install Docker Desktop: https://docs.docker.com/get-docker/' : undefined,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return {
|
|
212
|
+
name: 'Docker',
|
|
213
|
+
status: 'warn',
|
|
214
|
+
message: 'Docker module not loaded',
|
|
215
|
+
detail: 'Sandbox features may be limited',
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async checkConnectivity() {
|
|
220
|
+
try {
|
|
221
|
+
const controller = new AbortController();
|
|
222
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
223
|
+
const response = await fetch('https://www.google.com/generate_204', {
|
|
224
|
+
signal: controller.signal,
|
|
225
|
+
method: 'HEAD',
|
|
226
|
+
});
|
|
227
|
+
clearTimeout(timeout);
|
|
228
|
+
const status = response.ok || response.status === 204 ? 'pass' : 'warn';
|
|
229
|
+
return {
|
|
230
|
+
name: 'Internet Connectivity',
|
|
231
|
+
status: status,
|
|
232
|
+
message: status === 'pass' ? 'Internet reachable' : 'Connectivity issues detected',
|
|
233
|
+
detail: status === 'pass'
|
|
234
|
+
? 'Cloud providers can make API calls'
|
|
235
|
+
: 'Check your network connection for cloud providers',
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return {
|
|
240
|
+
name: 'Internet Connectivity',
|
|
241
|
+
status: 'warn',
|
|
242
|
+
message: 'No internet access detected',
|
|
243
|
+
detail: 'Cloud providers (Groq, Gemini, NIM, OpenRouter) will not work. Local models are unaffected.',
|
|
244
|
+
fix: 'Check your WiFi/Ethernet connection or proxy settings',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// ── Provider Checks ───────────────────────────────────────────────────────
|
|
249
|
+
async checkProvider(providerType, options) {
|
|
250
|
+
const checks = [];
|
|
251
|
+
const displayName = PROVIDER_LABELS[providerType] || `🔌 ${providerType} (plugin)`;
|
|
252
|
+
// 1. Configuration Check
|
|
253
|
+
const isLocal = providerType === 'local';
|
|
254
|
+
const hasApiKey = this.hasApiKey(providerType);
|
|
255
|
+
const isPluginProvider = !BUILTIN_PROVIDERS.includes(providerType);
|
|
256
|
+
const hasConfig = isLocal || hasApiKey || isPluginProvider;
|
|
257
|
+
if (!hasConfig && !isLocal) {
|
|
258
|
+
checks.push({
|
|
259
|
+
name: 'Configuration',
|
|
260
|
+
status: 'fail',
|
|
261
|
+
message: `No API key found for '${providerType}'`,
|
|
262
|
+
detail: `Set ${this.getEnvVarName(providerType)} environment variable or add to ~/.buff/buffconfig.json`,
|
|
263
|
+
fix: this.getFixSuggestion(providerType),
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
else if (isLocal) {
|
|
267
|
+
checks.push({
|
|
268
|
+
name: 'Configuration',
|
|
269
|
+
status: 'pass',
|
|
270
|
+
message: 'Local models: no API key needed',
|
|
271
|
+
detail: 'Using Ollama / HuggingFace / GGML runner',
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
checks.push({
|
|
276
|
+
name: 'API Key',
|
|
277
|
+
status: 'pass',
|
|
278
|
+
message: 'API key is configured',
|
|
279
|
+
detail: `Using ${this.getEnvVarName(providerType)}`,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
// Skip further checks if no API key for non-local providers
|
|
283
|
+
if (!hasConfig && !isLocal) {
|
|
284
|
+
return {
|
|
285
|
+
providerType,
|
|
286
|
+
displayName,
|
|
287
|
+
configured: false,
|
|
288
|
+
checks,
|
|
289
|
+
overallStatus: 'fail',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// 2. Provider instantiation and availability check
|
|
293
|
+
try {
|
|
294
|
+
const provider = this.createProvider(providerType);
|
|
295
|
+
const providerName = provider.name;
|
|
296
|
+
checks.push({
|
|
297
|
+
name: 'Provider Module',
|
|
298
|
+
status: 'pass',
|
|
299
|
+
message: `Provider "${providerName}" loaded successfully`,
|
|
300
|
+
detail: `Type: ${providerType}`,
|
|
301
|
+
});
|
|
302
|
+
// 3. Availability check (reachable endpoint)
|
|
303
|
+
const isAvailable = await this.withTimeout(provider.isAvailable(), CHECK_TIMEOUT_MS, `${providerType} availability check`);
|
|
304
|
+
checks.push({
|
|
305
|
+
name: 'Endpoint',
|
|
306
|
+
status: isAvailable ? 'pass' : 'fail',
|
|
307
|
+
message: isAvailable
|
|
308
|
+
? `Endpoint reachable`
|
|
309
|
+
: `Endpoint not reachable`,
|
|
310
|
+
detail: isAvailable
|
|
311
|
+
? `${providerType} API is responding`
|
|
312
|
+
: this.getEndpointFailureDetail(providerType),
|
|
313
|
+
fix: isAvailable ? undefined : this.getEndpointFix(providerType),
|
|
314
|
+
});
|
|
315
|
+
// 4. Model listing check (optional — may fail for some providers)
|
|
316
|
+
if (options.verbose || providerType === 'local') {
|
|
317
|
+
try {
|
|
318
|
+
const models = await this.withTimeout(provider.listModels(), CHECK_TIMEOUT_MS, `${providerType} model listing`);
|
|
319
|
+
checks.push({
|
|
320
|
+
name: 'Model Listing',
|
|
321
|
+
status: models.length > 0 ? 'pass' : 'warn',
|
|
322
|
+
message: models.length > 0
|
|
323
|
+
? `${models.length} model(s) available`
|
|
324
|
+
: 'No models found',
|
|
325
|
+
detail: models.length > 0
|
|
326
|
+
? `Available: ${models.slice(0, 5).map((m) => m.id).join(', ')}${models.length > 5 ? `... and ${models.length - 5} more` : ''}`
|
|
327
|
+
: `${providerType} returned no models. Check your configuration.`,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
checks.push({
|
|
332
|
+
name: 'Model Listing',
|
|
333
|
+
status: 'warn',
|
|
334
|
+
message: 'Could not fetch model list',
|
|
335
|
+
detail: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
checks.push({
|
|
341
|
+
name: 'Model Listing',
|
|
342
|
+
status: 'pass',
|
|
343
|
+
message: 'Skipped (use --verbose to check)',
|
|
344
|
+
detail: 'Run `buff doctor --verbose` to check model listing',
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
// 5. Quick generation test (only in verbose mode)
|
|
348
|
+
if (options.verbose) {
|
|
349
|
+
try {
|
|
350
|
+
const quickResult = await this.withTimeout(provider.generate('Say "ok" in one word.', {
|
|
351
|
+
model: this.getDefaultModel(providerType),
|
|
352
|
+
maxTokens: 10,
|
|
353
|
+
temperature: 0.1,
|
|
354
|
+
}), CHECK_TIMEOUT_MS, `${providerType} quick generation`);
|
|
355
|
+
const isOk = quickResult.toLowerCase().includes('ok');
|
|
356
|
+
checks.push({
|
|
357
|
+
name: 'Quick Generation',
|
|
358
|
+
status: isOk ? 'pass' : 'warn',
|
|
359
|
+
message: isOk
|
|
360
|
+
? 'Quick generation test passed'
|
|
361
|
+
: 'Generation test completed but response unexpected',
|
|
362
|
+
detail: isOk
|
|
363
|
+
? `Response: "${quickResult.slice(0, 100)}"`
|
|
364
|
+
: `Unexpected response: "${quickResult.slice(0, 100)}"`,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
checks.push({
|
|
369
|
+
name: 'Quick Generation',
|
|
370
|
+
status: 'fail',
|
|
371
|
+
message: 'Generation test failed',
|
|
372
|
+
detail: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
373
|
+
fix: this.getGenerationFix(providerType),
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
checks.push({
|
|
379
|
+
name: 'Quick Generation',
|
|
380
|
+
status: 'pass',
|
|
381
|
+
message: 'Skipped (use --verbose to test)',
|
|
382
|
+
detail: 'Run `buff doctor --verbose` to test actual generation',
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
checks.push({
|
|
388
|
+
name: 'Provider Instantiation',
|
|
389
|
+
status: 'fail',
|
|
390
|
+
message: `Failed to create provider: ${err instanceof Error ? err.message : String(err)}`,
|
|
391
|
+
detail: `Check your configuration in ~/.buff/buffconfig.json`,
|
|
392
|
+
fix: this.getFixSuggestion(providerType),
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
const overallStatus = this.calculateOverallStatus(checks);
|
|
396
|
+
return {
|
|
397
|
+
providerType,
|
|
398
|
+
displayName,
|
|
399
|
+
configured: true,
|
|
400
|
+
checks,
|
|
401
|
+
overallStatus,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
// ── Rendering ─────────────────────────────────────────────────────────────
|
|
405
|
+
renderSystemSection(checks) {
|
|
406
|
+
logger.highlight(' ── System Health ──');
|
|
407
|
+
for (const check of checks) {
|
|
408
|
+
const icon = this.statusIcon(check.status);
|
|
409
|
+
console.log(` ${icon} ${check.name}: ${check.message}`);
|
|
410
|
+
if (check.fix && check.status === 'fail') {
|
|
411
|
+
console.log(` 💡 Fix: ${check.fix}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
renderProviderSection(results, verbose) {
|
|
416
|
+
logger.highlight(' ── Provider Health ──');
|
|
417
|
+
for (const result of results) {
|
|
418
|
+
const overallIcon = this.statusIcon(result.overallStatus);
|
|
419
|
+
console.log(`\n ${overallIcon} ${result.displayName}`);
|
|
420
|
+
if (!result.configured) {
|
|
421
|
+
console.log(` ❌ Not configured`);
|
|
422
|
+
const failCheck = result.checks[0];
|
|
423
|
+
if (failCheck?.fix) {
|
|
424
|
+
console.log(` 💡 ${failCheck.fix}`);
|
|
425
|
+
}
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
for (const check of result.checks) {
|
|
429
|
+
const icon = this.statusIcon(check.status);
|
|
430
|
+
const detailStr = verbose && check.detail ? ` — ${check.detail}` : '';
|
|
431
|
+
console.log(` ${icon} ${check.name}: ${check.message}${detailStr}`);
|
|
432
|
+
if (check.fix && check.status === 'fail') {
|
|
433
|
+
console.log(` 💡 Fix: ${check.fix}`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
renderSummary(sysChecks, providerResults) {
|
|
439
|
+
const allChecks = [
|
|
440
|
+
...sysChecks,
|
|
441
|
+
...providerResults.flatMap((p) => p.checks),
|
|
442
|
+
];
|
|
443
|
+
const passed = allChecks.filter((c) => c.status === 'pass').length;
|
|
444
|
+
const warned = allChecks.filter((c) => c.status === 'warn').length;
|
|
445
|
+
const failed = allChecks.filter((c) => c.status === 'fail').length;
|
|
446
|
+
const configuredProviders = providerResults.filter((p) => p.configured).length;
|
|
447
|
+
const healthyProviders = providerResults.filter((p) => p.overallStatus === 'pass').length;
|
|
448
|
+
console.log(' ── Summary ──');
|
|
449
|
+
console.log(` ✅ Passed: ${passed} ⚠️ Warnings: ${warned} ❌ Failed: ${failed}`);
|
|
450
|
+
console.log(` Providers: ${healthyProviders}/${configuredProviders} healthy`);
|
|
451
|
+
if (failed > 0) {
|
|
452
|
+
console.log('');
|
|
453
|
+
console.log(' ❌ Failed checks require attention. Use --verbose for details.');
|
|
454
|
+
console.log(' 💡 Run `buff doctor --fix` to attempt auto-fix for common issues.');
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
// ── Auto-Fix ──────────────────────────────────────────────────────────────
|
|
458
|
+
async autoFix(sysChecks, providerResults) {
|
|
459
|
+
logger.highlight('\n ── Auto-Fix Mode ──');
|
|
460
|
+
let fixesApplied = 0;
|
|
461
|
+
// 1. Create ~/.buff/ directories if missing
|
|
462
|
+
const buffDir = join(homedir(), '.buff');
|
|
463
|
+
const dirsToCreate = [
|
|
464
|
+
buffDir,
|
|
465
|
+
join(buffDir, 'memory'),
|
|
466
|
+
join(buffDir, 'plugins'),
|
|
467
|
+
join(buffDir, 'agents'),
|
|
468
|
+
join(buffDir, 'workflows'),
|
|
469
|
+
];
|
|
470
|
+
for (const dir of dirsToCreate) {
|
|
471
|
+
if (!existsSync(dir)) {
|
|
472
|
+
try {
|
|
473
|
+
mkdirSync(dir, { recursive: true });
|
|
474
|
+
logger.success(`Created directory: ${dir}`);
|
|
475
|
+
fixesApplied++;
|
|
476
|
+
}
|
|
477
|
+
catch (err) {
|
|
478
|
+
logger.error(`Failed to create ${dir}: ${err}`);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
// 2. Check for and warn about missing API keys
|
|
483
|
+
for (const provider of ['groq', 'gemini', 'openrouter', 'nim']) {
|
|
484
|
+
const pr = providerResults.find((p) => p.providerType === provider);
|
|
485
|
+
if (pr && !pr.configured) {
|
|
486
|
+
const envVar = this.getEnvVarName(provider);
|
|
487
|
+
logger.warn(`Missing API key for ${provider}. Set ${envVar}=your_key_here`);
|
|
488
|
+
fixesApplied++;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
if (fixesApplied === 0) {
|
|
492
|
+
logger.info('No auto-fixable issues found.');
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
console.log('');
|
|
496
|
+
logger.success(`Applied ${fixesApplied} fix(es). Run 'buff doctor' again to verify.`);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
500
|
+
statusIcon(status) {
|
|
501
|
+
switch (status) {
|
|
502
|
+
case 'pass': return '✅';
|
|
503
|
+
case 'warn': return '⚠️';
|
|
504
|
+
case 'fail': return '❌';
|
|
505
|
+
default: return '❓';
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
hasApiKey(providerType) {
|
|
509
|
+
return this.configManager.hasRequiredCredentials(providerType);
|
|
510
|
+
}
|
|
511
|
+
createProvider(providerType) {
|
|
512
|
+
if (BUILTIN_PROVIDERS.includes(providerType)) {
|
|
513
|
+
const { config } = this.configManager.getProviderConfig(providerType);
|
|
514
|
+
return ProviderFactory.createProvider(providerType, config);
|
|
515
|
+
}
|
|
516
|
+
// Plugin provider
|
|
517
|
+
const registry = getPluginRegistry();
|
|
518
|
+
const plugin = registry.getPlugin(providerType);
|
|
519
|
+
if (!plugin) {
|
|
520
|
+
throw new Error(`No plugin found for provider type: ${providerType}`);
|
|
521
|
+
}
|
|
522
|
+
const config = this.configManager.getAll().providers[providerType] || {};
|
|
523
|
+
return plugin.createProvider(config);
|
|
524
|
+
}
|
|
525
|
+
getEnvVarName(providerType) {
|
|
526
|
+
const map = {
|
|
527
|
+
groq: 'GROQ_API_KEY',
|
|
528
|
+
gemini: 'GEMINI_API_KEY',
|
|
529
|
+
nim: 'NVIDIA_NIM_API_KEY',
|
|
530
|
+
openrouter: 'OPENROUTER_API_KEY',
|
|
531
|
+
};
|
|
532
|
+
return map[providerType] || `${providerType.toUpperCase()}_API_KEY`;
|
|
533
|
+
}
|
|
534
|
+
getDefaultModel(providerType) {
|
|
535
|
+
const config = this.configManager.getAll().providers[providerType];
|
|
536
|
+
return config?.model;
|
|
537
|
+
}
|
|
538
|
+
getFixSuggestion(providerType) {
|
|
539
|
+
const envVar = this.getEnvVarName(providerType);
|
|
540
|
+
return `Set ${envVar}=your_api_key in your shell profile, or run:\n echo "export ${envVar}=your_key" >> ~/.zshrc\n Or add it to ~/.buff/buffconfig.json`;
|
|
541
|
+
}
|
|
542
|
+
getEndpointFailureDetail(providerType) {
|
|
543
|
+
const endpoints = {
|
|
544
|
+
local: 'Ollama not running at http://localhost:11434. Run: ollama serve',
|
|
545
|
+
groq: 'Groq API endpoint not reachable. Check your API key and internet connection.',
|
|
546
|
+
gemini: 'Gemini API endpoint not reachable. Check your API key and internet connection.',
|
|
547
|
+
nim: 'NVIDIA NIM endpoint not reachable. Check your API key and internet connection.',
|
|
548
|
+
openrouter: 'OpenRouter endpoint not reachable. Check your API key and internet connection.',
|
|
549
|
+
};
|
|
550
|
+
return endpoints[providerType] || `Provider endpoint not reachable`;
|
|
551
|
+
}
|
|
552
|
+
getEndpointFix(providerType) {
|
|
553
|
+
const fixes = {
|
|
554
|
+
local: 'Run `ollama serve` to start the Ollama server',
|
|
555
|
+
groq: 'Verify GROQ_API_KEY is correct at https://console.groq.com/keys',
|
|
556
|
+
gemini: 'Verify GEMINI_API_KEY is correct at https://aistudio.google.com/app/apikey',
|
|
557
|
+
nim: 'Verify NVIDIA_NIM_API_KEY is correct',
|
|
558
|
+
openrouter: 'Verify OPENROUTER_API_KEY is correct at https://openrouter.ai/keys',
|
|
559
|
+
};
|
|
560
|
+
return fixes[providerType] || `Check your API key and configuration`;
|
|
561
|
+
}
|
|
562
|
+
getGenerationFix(providerType) {
|
|
563
|
+
const fixes = {
|
|
564
|
+
local: 'Ensure Ollama has a model pulled: `ollama pull llama2`',
|
|
565
|
+
groq: 'Ensure the model is available in your Groq account',
|
|
566
|
+
gemini: 'Ensure the model name is correct and your API key has access',
|
|
567
|
+
nim: 'Ensure the model is available on your NIM endpoint',
|
|
568
|
+
};
|
|
569
|
+
return fixes[providerType] || `Check provider configuration`;
|
|
570
|
+
}
|
|
571
|
+
calculateOverallStatus(checks) {
|
|
572
|
+
if (checks.some((c) => c.status === 'fail'))
|
|
573
|
+
return 'fail';
|
|
574
|
+
if (checks.some((c) => c.status === 'warn'))
|
|
575
|
+
return 'warn';
|
|
576
|
+
return 'pass';
|
|
577
|
+
}
|
|
578
|
+
async withTimeout(promise, timeoutMs, label) {
|
|
579
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
580
|
+
setTimeout(() => reject(new Error(`${label} timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
581
|
+
});
|
|
582
|
+
return Promise.race([promise, timeoutPromise]);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA6B5C,+EAA+E;AAE/E,MAAM,eAAe,GAA2B;IAC9C,KAAK,EAAE,wCAAwC;IAC/C,IAAI,EAAE,QAAQ;IACd,GAAG,EAAE,eAAe;IACpB,MAAM,EAAE,kBAAkB;IAC1B,UAAU,EAAE,eAAe;CAC5B,CAAC;AAEF,MAAM,iBAAiB,GAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAE3F,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,gBAAgB;AACjD,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,2CAA2C;AAE5E,+EAA+E;AAE/E,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC5C,MAAM;QACJ,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;aAClC,WAAW,CAAC,wEAAwE,CAAC,CAAC;QAEzF,OAAO;aACJ,MAAM,CAAC,2BAA2B,EAAE,gCAAgC,CAAC;aACrE,MAAM,CAAC,SAAS,EAAE,kDAAkD,EAAE,KAAK,CAAC;aAC5E,MAAM,CAAC,WAAW,EAAE,sCAAsC,EAAE,KAAK,CAAC;aAClE,MAAM,CAAC,OAAO,EAAE,mCAAmC,EAAE,KAAK,CAAC;aAC3D,MAAM,CAAC,KAAK,EAAE,OAKd,EAAE,EAAE;YACH,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,YAAY,CAAC,OAI1B;QACC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,SAAS;QACT,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,uEAAuE;QACvE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE/C,uEAAuE;QACvE,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ;YACvC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACpB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC;QAE3B,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,gBAAgB,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,eAAe,GAAqB,EAAE,CAAC;QAE7C,KAAK,MAAM,YAAY,IAAI,gBAAgB,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC/D,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE1C,uEAAuE;QACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,uEAAuE;QACvE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,uEAAuE;QACvE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,eAAe;YAC1B,UAAU;SACX,CAAC;IACJ,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,YAAY,CAAC,OAI1B;QACC,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAEjF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,wBAAwB;YACxB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,MAAM,OAAO,EAAE,CAAC;QAEhB,qBAAqB;QACrB,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE9C,2BAA2B;QAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,eAAe;QAC3B,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,sBAAsB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YAC7C,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;gBAC1B,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,oBAAoB;YACxB,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC;gBACzB,CAAC,CAAC,SAAS,OAAO,EAAE;gBACpB,CAAC,CAAC,+CAA+C;YACnD,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,wDAAwD,CAAC,CAAC,CAAC,SAAS;SACjG,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACtC,OAAO,EAAE,YAAY;gBACnB,CAAC,CAAC,wBAAwB;gBAC1B,CAAC,CAAC,0DAA0D;YAC9D,MAAM,EAAE,SAAS,SAAS,EAAE;SAC7B,CAAC,CAAC;QAEH,uCAAuC;QACvC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,sBAAsB;gBAC/B,MAAM,EAAE,sCAAsC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,wBAAwB;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;YACnJ,MAAM,EAAE,qBAAqB,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,2BAA2B,IAAI;gBACvF,oBAAoB,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,2BAA2B,IAAI;gBACrF,uBAAuB,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,2BAA2B,EAAE;SAClG,CAAC,CAAC;QAEH,+BAA+B;QAC/B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,4BAA4B;gBACrC,MAAM,EAAE,kCAAkC;aAC3C,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAEpD,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACnC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,yBAAyB;gBACtE,MAAM,EAAE,SAAS;oBACf,CAAC,CAAC,yDAAyD;oBAC3D,CAAC,CAAC,wDAAwD;gBAC5D,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC,SAAS;aAC5F,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,0BAA0B;gBACnC,MAAM,EAAE,iCAAiC;aAC1C,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;YAE3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;gBAClE,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,CAAC;YAEtB,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACxE,OAAO;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE,MAAsB;gBAC9B,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,8BAA8B;gBAClF,MAAM,EAAE,MAAM,KAAK,MAAM;oBACvB,CAAC,CAAC,oCAAoC;oBACtC,CAAC,CAAC,mDAAmD;aACxD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,6BAA6B;gBACtC,MAAM,EAAE,6FAA6F;gBACrG,GAAG,EAAE,uDAAuD;aAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,aAAa,CACzB,YAAoB,EACpB,OAA8B;QAE9B,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,MAAM,YAAY,WAAW,CAAC;QAEnF,yBAAyB;QACzB,MAAM,OAAO,GAAG,YAAY,KAAK,OAAO,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,gBAAgB,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAA4B,CAAC,CAAC;QACnF,MAAM,SAAS,GAAG,OAAO,IAAI,SAAS,IAAI,gBAAgB,CAAC;QAE3D,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yBAAyB,YAAY,GAAG;gBACjD,MAAM,EAAE,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,yDAAyD;gBACxG,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,iCAAiC;gBAC1C,MAAM,EAAE,0CAA0C;aACnD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,uBAAuB;gBAChC,MAAM,EAAE,SAAS,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;aACpD,CAAC,CAAC;QACL,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO;gBACL,YAAY;gBACZ,WAAW;gBACX,UAAU,EAAE,KAAK;gBACjB,MAAM;gBACN,aAAa,EAAE,MAAM;aACtB,CAAC;QACJ,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;YAEnC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,iBAAiB;gBACvB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,aAAa,YAAY,uBAAuB;gBACzD,MAAM,EAAE,SAAS,YAAY,EAAE;aAChC,CAAC,CAAC;YAEH,6CAA6C;YAC7C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CACxC,QAAQ,CAAC,WAAW,EAAE,EACtB,gBAAgB,EAChB,GAAG,YAAY,qBAAqB,CACrC,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACrC,OAAO,EAAE,WAAW;oBAClB,CAAC,CAAC,oBAAoB;oBACtB,CAAC,CAAC,wBAAwB;gBAC5B,MAAM,EAAE,WAAW;oBACjB,CAAC,CAAC,GAAG,YAAY,oBAAoB;oBACrC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC;gBAC/C,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;aACjE,CAAC,CAAC;YAEH,kEAAkE;YAClE,IAAI,OAAO,CAAC,OAAO,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,QAAQ,CAAC,UAAU,EAAE,EACrB,gBAAgB,EAChB,GAAG,YAAY,gBAAgB,CAChC,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,eAAe;wBACrB,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;4BACxB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,qBAAqB;4BACvC,CAAC,CAAC,iBAAiB;wBACrB,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;4BACvB,CAAC,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;4BAC/H,CAAC,CAAC,GAAG,YAAY,gDAAgD;qBACpE,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,eAAe;wBACrB,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,4BAA4B;wBACrC,MAAM,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBACrE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,kCAAkC;oBAC3C,MAAM,EAAE,oDAAoD;iBAC7D,CAAC,CAAC;YACL,CAAC;YAED,kDAAkD;YAClD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CACxC,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,EAAE;wBACzC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;wBACzC,SAAS,EAAE,EAAE;wBACb,WAAW,EAAE,GAAG;qBACjB,CAAC,EACF,gBAAgB,EAChB,GAAG,YAAY,mBAAmB,CACnC,CAAC;oBAEF,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,kBAAkB;wBACxB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBAC9B,OAAO,EAAE,IAAI;4BACX,CAAC,CAAC,8BAA8B;4BAChC,CAAC,CAAC,mDAAmD;wBACvD,MAAM,EAAE,IAAI;4BACV,CAAC,CAAC,cAAc,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;4BAC5C,CAAC,CAAC,yBAAyB,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;qBAC1D,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,kBAAkB;wBACxB,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,wBAAwB;wBACjC,MAAM,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;wBACpE,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;qBACzC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,iCAAiC;oBAC1C,MAAM,EAAE,uDAAuD;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,wBAAwB;gBAC9B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBACzF,MAAM,EAAE,qDAAqD;gBAC7D,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAE1D,OAAO;YACL,YAAY;YACZ,WAAW;YACX,UAAU,EAAE,IAAI;YAChB,MAAM;YACN,aAAa;SACd,CAAC;IACJ,CAAC;IAED,6EAA6E;IAErE,mBAAmB,CAAC,MAAqB;QAC/C,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAEzD,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAEO,qBAAqB,CAC3B,OAAyB,EACzB,OAAiB;QAEjB,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAE5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,WAAW,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAExD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC1C,CAAC;gBACD,SAAS;YACX,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3C,MAAM,SAAS,GAAG,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC;gBACxE,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACzC,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,aAAa,CACnB,SAAwB,EACxB,eAAiC;QAEjC,MAAM,SAAS,GAAG;YAChB,GAAG,SAAS;YACZ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SAC5C,CAAC;QAEF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAEnE,MAAM,mBAAmB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAC/E,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAE1F,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,mBAAmB,MAAM,eAAe,MAAM,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,gBAAgB,gBAAgB,IAAI,mBAAmB,UAAU,CAAC,CAAC;QAE/E,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,OAAO,CACnB,SAAwB,EACxB,eAAiC;QAEjC,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAC5C,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,4CAA4C;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG;YACnB,OAAO;YACP,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;YACvB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;YACxB,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;YACvB,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;SAC3B,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACpC,MAAM,CAAC,OAAO,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;oBAC5C,YAAY,EAAE,CAAC;gBACjB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAmB,EAAE,CAAC;YACjF,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC;YACpE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,uBAAuB,QAAQ,SAAS,MAAM,gBAAgB,CAAC,CAAC;gBAC5E,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,OAAO,CAAC,WAAW,YAAY,8CAA8C,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,UAAU,CAAC,MAAoB;QACrC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC;YACxB,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC;YACzB,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC;YACxB,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,YAAoB;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,YAA4B,CAAC,CAAC;IACjF,CAAC;IAEO,cAAc,CAAC,YAAoB;QACzC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,YAA4B,CAAC,EAAE,CAAC;YAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,YAA4B,CAAC,CAAC;YACtF,OAAO,eAAe,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;QAED,kBAAkB;QAClB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,YAA4B,CAAC,IAAI,EAAE,CAAC;QACzF,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAEO,aAAa,CAAC,YAAoB;QACxC,MAAM,GAAG,GAA2B;YAClC,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,gBAAgB;YACxB,GAAG,EAAE,oBAAoB;YACzB,UAAU,EAAE,oBAAoB;SACjC,CAAC;QACF,OAAO,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC;IACtE,CAAC;IAEO,eAAe,CAAC,YAAoB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,YAA4B,CAAC,CAAC;QACnF,OAAO,MAAM,EAAE,KAAK,CAAC;IACvB,CAAC;IAEO,gBAAgB,CAAC,YAAoB;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAChD,OAAO,OAAO,MAAM,uEAAuE,MAAM,uEAAuE,CAAC;IAC3K,CAAC;IAEO,wBAAwB,CAAC,YAAoB;QACnD,MAAM,SAAS,GAA2B;YACxC,KAAK,EAAE,iEAAiE;YACxE,IAAI,EAAE,8EAA8E;YACpF,MAAM,EAAE,gFAAgF;YACxF,GAAG,EAAE,gFAAgF;YACrF,UAAU,EAAE,gFAAgF;SAC7F,CAAC;QACF,OAAO,SAAS,CAAC,YAAY,CAAC,IAAI,iCAAiC,CAAC;IACtE,CAAC;IAEO,cAAc,CAAC,YAAoB;QACzC,MAAM,KAAK,GAA2B;YACpC,KAAK,EAAE,+CAA+C;YACtD,IAAI,EAAE,iEAAiE;YACvE,MAAM,EAAE,4EAA4E;YACpF,GAAG,EAAE,sCAAsC;YAC3C,UAAU,EAAE,oEAAoE;SACjF,CAAC;QACF,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,sCAAsC,CAAC;IACvE,CAAC;IAEO,gBAAgB,CAAC,YAAoB;QAC3C,MAAM,KAAK,GAA2B;YACpC,KAAK,EAAE,wDAAwD;YAC/D,IAAI,EAAE,oDAAoD;YAC1D,MAAM,EAAE,8DAA8D;YACtE,GAAG,EAAE,oDAAoD;SAC1D,CAAC;QACF,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,8BAA8B,CAAC;IAC/D,CAAC;IAEO,sBAAsB,CAAC,MAAqB;QAClD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,OAAmB,EACnB,SAAiB,EACjB,KAAa;QAEb,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,SAAS,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { BaseCommand } from './commands.js';
|
|
3
|
+
/**
|
|
4
|
+
* Edit command — edit files using AI assistance
|
|
5
|
+
* buff edit <file> [--provider nim] [--instruction "add error handling"]
|
|
6
|
+
*/
|
|
7
|
+
export declare class EditCommand extends BaseCommand {
|
|
8
|
+
create(): Command;
|
|
9
|
+
private execute;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/cli/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C;;;GAGG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,MAAM,IAAI,OAAO;YAgBH,OAAO;CA4EtB"}
|