feat(vscode): multi-provider speech synthesis for AI responses#8839
feat(vscode): multi-provider speech synthesis for AI responses#8839Ghenghis wants to merge 76 commits intoKilo-Org:mainfrom
Conversation
sync to main
| const [speechSettings, setSpeechSettings] = createSignal<SpeechSettings | null>(null) | ||
| let lastSpokenMessageId = "" | ||
|
|
||
| onMount(() => { |
There was a problem hiding this comment.
WARNING: Speech settings never refresh after the initial load
AppContent requests speechSettingsLoaded once on mount, but SpeechTab only sends updateSetting messages and the extension never pushes a refreshed settings payload back. In practice, toggling enabled, autoSpeak, or interruptOnType in the current webview will not change auto-speak behavior until the webview is reloaded.
| region: ss.azure.region, | ||
| apiKey: ss.azure.apiKey, | ||
| voiceId: ss.azure.voiceId, | ||
| pitch: ss.tuning.pitch + sentiment.pitchModifier, |
There was a problem hiding this comment.
WARNING: sentimentIntensity has no effect on synthesis
The new slider is persisted in settings, but the auto-speak path always applies the full detectSentiment() modifiers here. Changing kilo-code.new.speech.sentimentIntensity never scales these deltas, so the user-facing control does nothing.
| ensureAudioReady() | ||
|
|
||
| _abortController = new AbortController() | ||
| const cacheKey = SynthesisCache.hash(text, opts.voiceId, opts.style ?? "default", opts.pitch ?? 0, opts.rate ?? 1.0) |
There was a problem hiding this comment.
WARNING: Cache key omits several tuning inputs
The synthesis cache only keys on text, voice, style, pitch, and rate. Changing styleDegree, emphasis, pronunciations, or audioFormat can still reuse stale audio from a previous request, so preview and auto-speak will not reliably reflect the current settings.
|
|
||
| // 6. Remove diff hunks (@@ ... @@, +/- lines) | ||
| result = result.replace(/^@@\s.*@@.*$/gm, "") | ||
| result = result.replace(/^[+-]{1,3}\s.*$/gm, "") |
There was a problem hiding this comment.
WARNING: This strips normal markdown bullet lists, not just diff hunks
/^[+-]{1,3}\s.*$/gm matches ordinary - item and + item list lines. Because assistant responses in this UI are commonly formatted as bullet lists, auto-speak will drop large chunks of normal prose before it ever reaches Azure TTS.
Code Review SummaryStatus: 17 Issues Found | Recommendation: Address before merge Overview
Fix these issues in Kilo Cloud Issue Details (click to expand)WARNING
SUGGESTION
Other Observations (not in diff)Issues found in unchanged code that cannot receive inline comments:
Files Reviewed (4 files)
Reviewed by gpt-5.4-20260305 · 2,162,277 tokens |
| await speak(previewText(), p, { | ||
| region: getRegion() || undefined, | ||
| apiKey: getApiKey(), | ||
| voiceId: voiceId ?? s.azure.voiceId, |
There was a problem hiding this comment.
WARNING: Non-Azure providers still fall back to an Azure voice ID
When the user switches providers, handleProviderChange() clears the selected voice but leaves the persisted fallback in speech.azure.voiceId. Preview then sends en-GB-MaisieNeural (or another Azure-specific id) to Google/OpenAI/ElevenLabs/Polly until the user manually picks a voice, and those providers do not recognize that id.
| description="Higher quality sounds better but uses more bandwidth and API quota" | ||
| > | ||
| <Select | ||
| options={AUDIO_FORMATS} |
There was a problem hiding this comment.
WARNING: Audio format options are not provider-specific
This select always uses the Azure AUDIO_FORMATS values even when the active provider advertises a different capabilities.audioFormats set. For example, Google expects MP3/OGG_OPUS/LINEAR16, so choosing one of these Azure-only values will generate invalid synth requests.
| method: "POST", | ||
| headers: { | ||
| "Content-Type": "application/json", | ||
| "X-Api-Key": apiKey, |
There was a problem hiding this comment.
WARNING: Polly requests cannot authenticate with this header
Amazon Polly does not accept a raw access key in X-Api-Key; browser-side calls must be SigV4-signed or proxied through a backend that signs them. As written, every synthesis request here will be rejected, so the Polly provider is effectively nonfunctional.
Extended AzureVoice interface with description and styles fields. Organized with en-GB first (Maisie as default voice). Removed EDGE_TTS references -- Azure-only edition. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- VoicePreset, SpeechSettings, PronunciationEntry interfaces - DEFAULT_SPEECH_SETTINGS with en-GB-MaisieNeural default - Speech message types added to WebviewMessage and ExtensionMessage unions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- tts-azure.ts: Azure REST API synthesis with SSML builder (prosody, styles, emphasis, custom pronunciations) - speech-playback.ts: Web Audio API playback with LRU cache (32 entries), volume control, abort/cancel support Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Section 1: Connection + Global (collapsible) - API key, region, enable/auto-speak toggles, volume, interaction mode, sentiment Section 2: Voice Browser + Favorites - search, locale filter, 125+ voice cards with star/preview, favorites chips bar Section 3: Voice Fine-Tuning (collapsible) - pitch, rate, volume, style chips, emphasis, pauses, pronunciations, presets Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added Speech tab between Context and Experimental tabs with speech-bubble icon. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- sendSpeechSettings(): reads all speech config from VS Code settings - validateAzureKey(): tests Azure TTS endpoint with a probe synthesis - Wired into init, reset, and message handler paths Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 24 speech configuration properties under kilo-code.new.speech.* - Covers connection, global, tuning, favorites, and presets - Default voice: en-GB-MaisieNeural - Updated displayName to "Kilo Code: Azure Voice Edition" Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Watches session busy→idle transition to speak last assistant reply - Strips markdown/code blocks/URLs for natural speech - Interrupts playback on keydown when interruptOnType enabled - Stops speech on session switch Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix eqeqeq warnings (== → === for null comparisons) - Compact KiloProvider speech methods to stay within max-lines - Add eslint-disable for complexity in message handler Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Port 25-rule speech-text-filter.ts with 5-layer guardrails from source, update App.tsx to use filterTextForSpeech + detectSentiment instead of inline regex, add Azure TTS endpoint to CSP connect-src, compact switch cases in KiloProvider to stay under max-lines lint rule. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Design for refactoring Azure-only speech into multi-provider architecture with Browser (free/offline) as default and 5 additional providers with free tiers (Azure, Google, OpenAI, ElevenLabs, Amazon Polly). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
15-task plan covering provider interface, 6 providers (Browser, Azure, Google, OpenAI, ElevenLabs, Polly), registry pattern, SpeechTab refactor, CSP/config updates, tests, and PR submission. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Define SpeechVoice, SynthesisOptions, and SpeechProvider interfaces for multi-provider speech architecture. Add SpeechProviderRegistry with register/get/list/listByTier operations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement BrowserProvider wrapping window.speechSynthesis with guards for non-browser environments. Free, offline, no API key required. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement AzureProvider that wraps tts-azure.ts and azure-voices.ts, mapping AzureVoice to SpeechVoice with full SSML/style capabilities and testConnection support. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…code Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Neural2 and Studio voices across en-US, en-GB, en-AU, en-IN locales with SSML support and 4M chars/month free tier. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
10 voices (alloy, ash, ballad, coral, echo, fable, nova, onyx, sage, shimmer) with mp3/opus/aac/flac output and Bearer auth. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
10 voices with actual ElevenLabs voice IDs, xi-api-key auth, and 10K chars/month free tier. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
20 neural voices across en-GB, en-US, en-AU, en-NZ, en-ZA, en-IE, en-IN with SSML/emphasis/pronunciation support. Notes SigV4 needed for production. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hard-coded Azure TTS with provider-agnostic speak() that accepts a SpeechProvider, delegates synthesis to provider.synthesize(), and handles both Blob results (Web Audio) and void results (Browser). Cache key now includes provider.id. stop() calls provider.stop() in addition to stopping any active AudioBufferSourceNode. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add provider dropdown with optgroups (free / free-tier), per-provider config sections (API key, region, test button), and capability-gated tuning controls (styles, emphasis, pronunciations, audio formats). Voice browser now renders voices from the active provider instead of hard-coded Azure list. Extract ProviderConfigSection and ApiKeyRow sub-components to keep complexity manageable. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…e-up Expand connect-src CSP to allow Google TTS, OpenAI, ElevenLabs, and Amazon Polly endpoints. Add package.json config keys for provider selection and per-provider API credentials. Update SpeechSettings interface and DEFAULT_SPEECH_SETTINGS with provider field and optional per-provider config blocks. Wire sendSpeechSettings() to read and transmit all new provider settings to the webview. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pass B (subsystem runtime) traced all 9 service constructors + happy paths: All 9 subsystems INIT: SAFE — no throws, no external access during construction. All 9 subsystems HAPPY PATH: WORKS — correct empty-state handling. Defects found and fixed: D-013 [Medium] VPS vpsServerAdd/Remove missing try/catch — added with validation D-017 [Medium] Memory recall project filter silently ignored — fixed arg passing D-018 [High] Memory write uncaught throw leaves webview hanging — added try/catch Defects opened (not blocking, fix deferred): D-014 [Medium] Training OOM risk on large dataset validation (readFileSync) D-015 [Medium] Governance tierLevel() no default case D-016 [Medium] Governance evidence bundles not persisted to disk Provider API bases verified correct: - Claude: api.anthropic.com/v1 - MiniMax: api.minimax.chat/v1 - SiliconFlow: api.siliconflow.com/v1 (D-001 confirmed fixed) - Ollama: localhost:11434 - LM Studio: localhost:1234 Typecheck: 12/12 clean. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rough D-029) Critical fix: Added top-level error boundary around KiloProvider message handler switch statement — any unhandled service throw now logs the error and sends a v4Error fallback to the webview instead of producing an unhandled Promise rejection that silently hangs the UI. Individual fixes: - ZeroClaw submit: try/catch with zeroClawError response (D-019) - ZeroClaw retry: user-facing warning on budget exhaustion (D-020) - Memory recall: try/catch with failed status response (D-021) - Memory diagnostics: try/catch with passed:false response (D-022) - Training launchJob: try/catch with trainingError response (D-023) - Training exportModel: try/catch with trainingError response (D-024) - Training resumeJob: try/catch with trainingError response (D-025) - Training compareRuns: try/catch with trainingError response (D-026) - Training cancelJob: status guard preventing completed/failed corruption (D-027) - Governance setUserTier: runtime validation of tier names (D-028) - Top-level error boundary in setupWebviewMessageHandler (D-029) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…documented Fixed: - D-015: GovernanceService tierLevel() default case returns 0 with warning - D-030: Tab panel providers now receive V4 services via setV4Services() — both openKiloInNewTab() and tab serializer wired - D-031: Governance subsystem registration wired — 10 registerSubsystem() calls in extension.ts; expectedSubsystems updated to match actual V4 services Documented as architecture gaps (non-blocking): - D-032: SSH/VPS not linked (VPS uses own SSH runner) - D-033: ZeroClaw/Routing not integrated (terminal runner by design) - D-034: VPS deploys bypass governance gate - D-035: Training/Workstation duplicate GPU limits Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All 6 audit passes executed (A through F): - Pass A: 12 defects, all fixed - Pass B: 6 defects, 4 fixed, 2 open (Medium) - Pass C: 11 defects, all fixed (including top-level error boundary) - Pass D: 7 defects, 3 fixed, 4 open (Medium architecture gaps) - Pass E: 2 new Low defects (tab handler gaps), all E2E flows verified - Pass F: Release readiness confirmed, manifest valid, build viable Critical defects independently VERIFIED by confirmer agent: - D-007: Routing tab — all 6 response types verified at exact lines - D-029: Error boundary — try/catch/v4Error verified at exact lines Final tally: 38 defects total, 30 fixed (2 verified), 8 open (6 Medium + 2 Low) Zero blocking defects. CONDITIONAL PASS — runtime testing pending. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| ] | ||
|
|
||
| // Weight map for subsystem importance (must sum to 1.0) | ||
| const subsystemWeights: Record<string, number> = { |
There was a problem hiding this comment.
WARNING: Audit weighting no longer matches the audited subsystem set
expectedSubsystems now includes ssh, vps, zeroClaw, routing, memory, training, and workstation, but this weight map still assigns weight to removed names like security, telemetry, configuration, and diagnostics. The missing subsystems then fall back to 1 / expectedSubsystems.length, so the total weight exceeds 1.0 and can inflate overallScore enough to report a false pass or conditional pass.
| const server = await this.addOrUpdateServer(serverData) | ||
| const isUpdate = (message.server as VPSServer).id === server.id | ||
| postToWebview({ | ||
| type: isUpdate ? "vpsServerUpdated" : "vpsServerAdded", |
There was a problem hiding this comment.
WARNING: New servers are always emitted as updates
isUpdate is computed after addOrUpdateServer() by comparing message.server.id with server.id, which is always true for valid input. Brand-new servers therefore emit vpsServerUpdated instead of vpsServerAdded, so consumers that initialize state from the add event will miss newly created entries.
All 8 V4 tabs were visual-only (buttons rendered but did nothing). Root cause: message property name mismatches between webview tabs and KiloProvider handlers caused every operation to silently fail. Fixes: - KiloProvider: fix Training (launch, GPU detect, compare, export, register, validate) to read tab's actual property names - KiloProvider: fix Memory (write, recall, permission) property shapes - KiloProvider: fix Governance ALL handlers (setTier user→userId, approve/reject approvalId→actionId, addAction spread→object, state wrapping) - KiloProvider: fix Routing routingSetMode overload to dispatch privacyMode and costThreshold correctly - KiloProvider: fix ZeroClaw submit (spread fields vs message.task) - KiloProvider: bridge SSH/ZeroClaw/Routing service events to webview - KiloProvider: fix sshOpenTerminal to call openTerminal() not connect() - KiloProvider: fix sshBrowseFiles to return results to webview - RoutingTab: use requestRoutingState for full init data - TrainingTab: add trainingError/trainingBrowsePathResult handlers, process GPUs from trainingState - GovernanceTab: read msg.state, use requestGovernanceState for init - ZeroClawTab: add zeroClawError handler - VPSService: fix add/update detection to check existing before mutate - RoutingService: store real API keys in SecretStorage, real cloud health checks - ZeroClawService: implement real git-based file rollback - WorkstationProfile: add real hardware detection (CPU, RAM, GPU via nvidia-smi, model directory scanning) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…e, governance defaults, SSH import - OnboardingDiscoveryService: auto-detect Ollama/LM Studio providers, GPU via nvidia-smi, SSH config import, hardware detection, Hermes/Shiba config, parallel discovery with caching - GovernanceService: pre-seed 8 dangerous actions (vps_deploy, ssh_root_access, training_launch, memory_wipe, etc.) with risk behaviors and auto-backfill on init - SSHService: importFromSSHConfig() parses ~/.ssh/config for hosts, ports, users, identity files, jump hosts — deduplicates against existing profiles - Extension activation: runs discovery in background, auto-tests providers and GPU - KiloProvider: requestDiscoveryResult/triggerDiscovery message handlers wired - Master roadmap: 4-phase plan from wiring integrity through E2E proof workflows Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- KiloLogger: centralized structured logging with VS Code OutputChannel ("KiloCode V4")
- Debug mode: kilo-code.v4.debugMode setting + "KiloCode V4: Toggle Debug Mode" command
- Message tracing: kilo-code.v4.messageTracing logs every webview↔extension message
- Per-service timing: log.time() for performance tracking on health checks, submissions
- All 8 V4 services now use KiloLogger (Routing, Governance, ZeroClaw, Memory, Training,
SSH, VPS, Workstation) — replaces inconsistent console.log/warn/error calls
- OnboardingDiscoveryService: helper functions now route through KiloLogger
- KiloProvider: inbound V4 message tracing at switch statement entry point
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ti-agent review - SSH sshBrowseFiles: removed manual postMessage (listFiles() returns void, event relay already handles sshFilesListed — was causing double-send with empty data overwriting correct data) - Governance: all 9 governanceState sends now go through sendGovernanceState() helper that enriches snapshot with checklist, releaseReadiness, rollbackReady from GovernanceService methods — Release Control section now shows real data Found by 4 independent code-reviewer agents auditing all 8 V4 tabs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Required for dynamic import("./services/onboarding") in extension.ts.
Was untracked — caused OnboardingDiscoveryService to fail to load at runtime.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
……', empty SSH, offline Ollama Root cause: OnboardingDiscoveryService ran in background but its results were orphaned — never pushed to SSHService, never triggered initial RoutingService health checks, tabs showed empty state forever. Fixes: 1. RoutingService: initial health check 1s after startup so Ollama/LM Studio show 'healthy' immediately if running (was waiting 60s for first interval) 2. KiloProvider requestRoutingState: kicks background health re-check on local providers when tab opens (non-blocking, streams results) 3. KiloProvider trainingGetJobs: auto-detects GPUs on tab open if cache empty 4. KiloProvider trainingDetectGPU: try/catch + always posts trainingGPUDetected (even on error) so tab never stays stuck on 'Detecting…' 5. KiloProvider requestSSHProfiles: lazy-imports ~/.ssh/config when profile list is empty — tab auto-populates from existing SSH config 6. extension.ts: discovery now calls sshService.importFromSSHConfig() after runFullDiscovery completes, so the first-run UX has profiles already imported 7. extension.ts: broadcasts discoveryComplete event so any open tabs refresh 8. RoutingTab: 15-second safety timeout on 'Testing…' state so the button never gets permanently stuck if backend hangs (SiliconFlow network issue) User-visible result: - Ollama shows 'healthy' automatically when running, no manual test needed - SiliconFlow 'Testing…' always resolves within 15s worst case - GPU auto-detects on tab open, 'Detecting…' always clears - SSH tab shows ~/.ssh/config hosts without manual import Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| // Governance | ||
| // Helper to send governance state to the webview (wrap in state property for tab) | ||
| case "requestGovernanceState": | ||
| case "governanceGetAuditLog": |
There was a problem hiding this comment.
WARNING: Audit log requests now return the wrong message type
governanceGetAuditLog used to answer with governanceAuditLog, which is still part of the webview message contract. This handler now only calls sendGovernanceState(), so the audit log view cannot receive filtered log entries and will silently stop updating even though the request still exists in the protocol.
| this.workstationProfile = services.workstation | ||
| if (services.discovery) this.discoveryService = services.discovery | ||
|
|
||
| // Bridge SSH service events to the webview |
There was a problem hiding this comment.
WARNING: Re-injecting V4 services leaks duplicate event listeners
setV4Services() subscribes to SSH, ZeroClaw, and Routing events every time it is called, but never disposes the previous subscriptions. This extension now calls it once before discovery and again after discovery resolves, so each later status change is delivered multiple times and the duplicate listeners keep accumulating across reinitializations.
…wizard + health recovery Addresses all 12 gaps the user identified: tabs waiting for manual input instead of being fed by detected data. Builds the filler system. NEW SERVICES: • SecureProfileService — unified secret/profile manager with strict split: - context.secrets → API keys, SSH passwords, tokens (encrypted) - globalState → provider choices, role matrix, voice prefs (cross-workspace) - workspaceState → project settings, discovery cache - Masked key display (never exposes real values to UI) - Legacy migration from old KV store • EnvironmentProbeService — ultra-fast sync probes (<100ms total): - Platform, arch, CPU, RAM, disk - File presence: ~/.ssh/config, known_hosts, .kilo/hermes.json, .kilo/shiba.json - Workspace folder, git repo detection - Baseline snapshot drives wizard decisions • VPSInventoryProbe — safe read-only SSH commands to auto-collect: - hostname, distro, kernel, uptime, CPU/RAM/disk - Docker, containers, running services, nginx/caddy, public IP - 17 parallel probes with 3s timeout each, fault-tolerant • HealthRecoveryService — CLI backend auto-recovery: - 30s monitor loop, exponential backoff [1s/5s/15s/60s/300s] - Status bar indicator with themed icons (healthy/degraded/disconnected) - kilo-code.v4.restartCliBackend command - Diagnostic report for About page ENHANCED SERVICES: • OnboardingDiscoveryService — 3 new probes added: - probeHermes() GETs /health on endpoint from .kilo/hermes.json (default :7001) - probeShiba() GETs /health, extracts connectedAgents list (default :7002) - probeZeroClaw() sets defaultScope=workspace path (default :7003) • MemoryService — autoConnect() on startup (500ms delay): - Searches workspace + home for .kilo/hermes.json and .kilo/shiba.json - Probes health endpoint with 2s timeout - Auto-transitions to "connected" state if reachable - Never clobbers local store on remote failure • ZeroClawService — getDefaultTaskContext() for tab bootstrap: - Pre-fills projectPath from current workspace - Default workspaceScope, riskLevel=low, networkPolicy=none - 3 pre-seeded templates (format, test, typecheck) NEW UI: • OnboardingWizard.tsx — 5-step guided setup: - Step 1: Discovery (auto-runs on mount) - Step 2: Review results with Accept/Edit checkboxes - Step 3: Secrets input (only for enabled cloud providers) - Step 4: Validation with live test results - Step 5: Completion summary • Registered command: kilo-code.v4.runOnboardingWizard MESSAGE PROTOCOL: • Added types: requestDiscoveryResult, triggerDiscovery, markOnboardingComplete, resetOnboarding, discoveryComplete, discoveryError, onboardingCompleted, onboardingReset, zeroClawContext • KiloProvider handlers for all new messages • triggerDiscovery now broadcasts discoveryComplete for tab auto-refresh DOCS: • docs/master-roadmap.md — comprehensive roadmap covering all 12 gaps with phase-by-phase plan, data models, E2E test matrix, priority order Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…>extensionContext, autoFillSetting call shape)
…add stream-chat type stub
…ump to v7.2.20, build kilo-code-7.2.20.vsix
- Add HermesTab.tsx: enable/disable, URL, approval mode, API key, agent-assist, task submit, task tracker - Add Hermes message types to V4SubsystemRequest + V4SubsystemMessage in messages.ts - Add handleHermesStatusRequest/TasksRequest/SubmitTask/AgentAssist handlers to KiloProvider - Add setHermesServices() to KiloProvider; wire in extension.ts for all provider instances - Wire HermesTab into Settings.tsx sidebar (between VPS and ZeroClaw) - ZeroClaw+Hermes agent-assist: autoFillAll() + getSuggestions() + config audit on demand - Build: kilo-code-7.2.20.vsix (70.91 MB)
…it fix, VSIX built
When upstream Kilo-Org cuts release commits that bump 'version' in packages/kilo-vscode/package.json (v7.2.21..v7.2.24 today, more weekly), they conflict with our DaveAI MAOS Edition branding fields. This driver auto-resolves the conflict deterministically: take the new version (and dependencies, scripts, contributes from upstream) while preserving displayName/description/publisher/icon/author/homepage/bugs/repository plus MAOS-titled commands. Setup (one-time per clone): bash scripts/setup-merge-drivers.sh Test: bash scripts/test-merge-driver.sh # PASS confirmed locally Effect on the upstream cherry-pick plan: 4 of the 9 currently-PROTECTED commits (release bumps) become auto-pickable. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…iloProvider.dave.ts (RFC 001) - KiloProvider.ts: 4474 → 3581 lines (-893) - KiloProvider.dave.ts: 1015 lines (new) - Single hook point: line 585 in KiloProvider.ts dispatches V4 messages to overlay - Verified: 0 grep matches for MAOS|hermes|zeroclaw|daveai|HubServices in slimmed KiloProvider.ts PENDING (next session, 30-60 min): - caller-site rewires in extension.ts (12 lines) and SettingsEditorProvider.ts (6 lines) - These callers invoke setHermesServices/setV4Services/broadcastDiscoveryComplete on the provider directly; must redirect to (provider as any).__daveExtensions DO NOT PUSH yet — husky typecheck will fail until callers are rewired. Branch preserved locally as work-in-progress for the next engineering session. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
chore: add package.json branding-preserving merge driver
Caller-site rewires for the RFC 001 overlay extraction:
- extension.ts: 11 lines updated (+ 1 import) to call (provider as unknown
as { __daveExtensions?: DaveProviderExtensions }).__daveExtensions?.X(...)
instead of provider.X(...) for setHermesServices, setV4Services,
broadcastDiscoveryComplete. Lines that target settingsEditorProvider
(not KiloProvider) are intentionally unchanged — SettingsEditorProvider
has its own internal forwarding.
- SettingsEditorProvider.ts: 4 lines updated (+ 1 import) for the
internal forwarding methods to invoke on the overlay.
- RFC_001_CALLER_REWIRES_NOTES.md: full diff table + test plan.
Effect: bun turbo typecheck should now pass on the feature branch. The
3 PROTECTED upstream commits 5107987, 6cc7863, 154f104 (autocomplete
refactors) are now auto-pickable.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…vices
Real-backend handlers (replace scaffolded UI-only versions):
- packages/kilo-vscode/src/kilo-provider/handlers/{hermes,memory,routing,zeroclaw,governance,training}-webview.ts
Each handler: fetch Hub at kilocode.updates.hubBaseUrl (fallback daveai.hub.baseUrl, then https://hermes.daveai.tech),
bearer auth from SecretStorage, structured response, graceful 404 degradation.
Hermes/Memory/Routing/ZeroClaw target existing services; Governance round-trips
via /api/canonical-settings; Training drives a Hub training router with honest mock.
- packages/kilo-vscode/src/kilo-provider/handlers/__tests__/*.test.ts (6 tests)
- packages/kilo-vscode/src/kilo-provider/handlers/*-webview.README.md (4 readmes)
KiloProvider.dave.ts (RFC 001 overlay) — wire-up:
- Import 6 handlers
- handleV4Message: dispatch to real-backend handlers FIRST (return true if consumed),
fall through to legacy in-process switch on miss/error
- isV4MessageType: add lowercase 'zeroclaw' alias (camelCase 'zeroClaw' kept for back-compat)
New services:
- packages/kilo-vscode/src/services/onboarding/ (5 files): OnboardingWizard.ts +
OnboardingService.ts + index.ts + README + tests. Auto-detect Hub URL +
env-var import + 5-question wizard. Goal: 2-min setup from clean install.
- packages/kilo-vscode/src/services/auto-update/ (5 files): AutoUpdateService.ts +
UpdatePromptUI.ts + index.ts + README + tests. Polls Hub /api/updates/manifest;
3 channels x 3 modes (prompt/auto/off).
Effect: tabs Hermes/Memory/Routing/ZeroClaw/Governance now reach real Hub-side
services; Training has honest mock executor; auto-update + onboarding wire up
on extension activate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
refactor: extract DaveAI customizations from KiloProvider.ts to KiloProvider.dave overlay (RFC 001)
Summary
Adds a Speech tab to Settings with 6 text-to-speech providers, all with free tiers:
Architecture
SpeechProviderinterface +SpeechProviderRegistry(matches upstream provider pattern)Key files
webview-ui/src/types/voice.ts— Core type definitionswebview-ui/src/data/speech-providers.ts— Registrywebview-ui/src/utils/speech-providers/— 6 provider implementationswebview-ui/src/utils/speech-playback.ts— Unified playback enginewebview-ui/src/components/settings/SpeechTab.tsx— Settings UITest plan
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com