release: v2.0.1 - Advanced Knowledge Mix & Architectural Intelligence
This commit is contained in:
@@ -66,13 +66,21 @@ export async function handleAgentMessage(provider: SidebarChatProvider, data: an
|
||||
if (!view) return true;
|
||||
try {
|
||||
const entry = getOrCreateAgentEntry(data.agentPath || '');
|
||||
const knowledgeMapHasEntry = entry.knowledgeFolders.length > 0 || (entry.skillFolders?.length ?? 0) > 0;
|
||||
const hasWeightOverride = typeof entry.secondBrainWeight === 'number';
|
||||
const knowledgeMapHasEntry = entry.knowledgeFolders.length > 0
|
||||
|| (entry.skillFolders?.length ?? 0) > 0
|
||||
|| !!(entry.model && entry.model.trim())
|
||||
|| hasWeightOverride;
|
||||
view.webview.postMessage({
|
||||
type: 'agentMapData',
|
||||
value: {
|
||||
name: entry.name,
|
||||
knowledgeFolders: entry.knowledgeFolders,
|
||||
skillFolders: entry.skillFolders || [],
|
||||
// Per-agent model override — empty string means "use current default model".
|
||||
model: entry.model || '',
|
||||
// null = no override (fall back to global slider); number = pinned 0–100.
|
||||
secondBrainWeight: hasWeightOverride ? entry.secondBrainWeight : null,
|
||||
exists: knowledgeMapHasEntry,
|
||||
},
|
||||
});
|
||||
@@ -80,7 +88,7 @@ export async function handleAgentMessage(provider: SidebarChatProvider, data: an
|
||||
logError('agent-map: load failed.', { error: e?.message ?? String(e) });
|
||||
view.webview.postMessage({
|
||||
type: 'agentMapData',
|
||||
value: { name: '', knowledgeFolders: [], skillFolders: [], exists: false },
|
||||
value: { name: '', knowledgeFolders: [], skillFolders: [], model: '', secondBrainWeight: null, exists: false },
|
||||
});
|
||||
}
|
||||
return true;
|
||||
@@ -96,10 +104,20 @@ export async function handleAgentMessage(provider: SidebarChatProvider, data: an
|
||||
const skillFolders = Array.isArray(data.skillFolders)
|
||||
? data.skillFolders.filter((f: unknown) => typeof f === 'string')
|
||||
: [];
|
||||
// Treat blank / "Use current model" as no override — drop the field entirely
|
||||
// so the JSON stays clean and the resolver falls back to the global default.
|
||||
const modelOverride = typeof data.model === 'string' ? data.model.trim() : '';
|
||||
// null / undefined / non-finite = "Use global setting" → drop the field.
|
||||
let weightOverride: number | undefined;
|
||||
if (typeof data.secondBrainWeight === 'number' && Number.isFinite(data.secondBrainWeight)) {
|
||||
weightOverride = Math.max(0, Math.min(100, Math.round(data.secondBrainWeight)));
|
||||
}
|
||||
const result = upsertAgentEntry({
|
||||
name,
|
||||
knowledgeFolders,
|
||||
skillFolders,
|
||||
model: modelOverride || undefined,
|
||||
secondBrainWeight: weightOverride,
|
||||
});
|
||||
view.webview.postMessage({
|
||||
type: 'agentMapSaved',
|
||||
|
||||
@@ -33,6 +33,9 @@ export async function handleChatMessage(provider: SidebarChatProvider, data: any
|
||||
await provider._sendChronicleProjects();
|
||||
await provider._restoreActiveSessionIntoView();
|
||||
await provider._sendReadyStatus();
|
||||
// Restore the Project Architecture chip + watcher if the active project
|
||||
// was already running in architecture mode in a previous VS Code session.
|
||||
await provider._sendArchitectureStatus();
|
||||
return true;
|
||||
case 'getReadyStatus':
|
||||
await provider._sendReadyStatus();
|
||||
@@ -100,6 +103,50 @@ export async function handleChatMessage(provider: SidebarChatProvider, data: any
|
||||
provider._lmStudio?.lifecycle.onModelSelected(data.value);
|
||||
return true;
|
||||
}
|
||||
case 'getKnowledgeMix': {
|
||||
// Ship the current global Knowledge Mix to the webview so the slider can
|
||||
// initialize. Per-agent overrides ride along with the agent map data.
|
||||
const cfg = vscode.workspace.getConfiguration('g1nation');
|
||||
const w = cfg.get<number>('knowledgeMix.secondBrainWeight', 50);
|
||||
const clamped = Math.max(0, Math.min(100, Math.round(typeof w === 'number' ? w : 50)));
|
||||
provider._view?.webview.postMessage({
|
||||
type: 'knowledgeMix',
|
||||
value: { weight: clamped, source: 'global' },
|
||||
});
|
||||
return true;
|
||||
}
|
||||
case 'setKnowledgeMix': {
|
||||
const raw = typeof data.value === 'number' ? data.value : NaN;
|
||||
if (!Number.isFinite(raw)) return true;
|
||||
const clamped = Math.max(0, Math.min(100, Math.round(raw)));
|
||||
// Use whichever scope already holds the value to avoid the same "Workspace
|
||||
// override shadows Global update" desync that the `model` case guards against.
|
||||
const { target } = pickConfigTarget('g1nation', 'knowledgeMix.secondBrainWeight');
|
||||
await vscode.workspace.getConfiguration('g1nation').update('knowledgeMix.secondBrainWeight', clamped, target);
|
||||
logInfo(`Knowledge Mix (global) updated to: ${clamped}`, { target });
|
||||
return true;
|
||||
}
|
||||
// ── Project Architecture (Feature 2) ──────────────────────────────────
|
||||
case 'getArchitectureStatus':
|
||||
await provider._sendArchitectureStatus();
|
||||
return true;
|
||||
case 'openArchitectureDoc':
|
||||
await provider._openArchitectureDoc();
|
||||
return true;
|
||||
case 'refreshArchitecture':
|
||||
await provider._refreshArchitecture();
|
||||
return true;
|
||||
case 'detachArchitecture':
|
||||
await provider._detachArchitecture();
|
||||
return true;
|
||||
case 'activateArchitectureFromText': {
|
||||
// Optional explicit-toggle path: webview can pass arbitrary text
|
||||
// (e.g. the current input draft) for one-shot intent detection.
|
||||
if (typeof data.text === 'string') {
|
||||
await provider._tryActivateArchitectureFromText(data.text);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case 'proactiveTrigger':
|
||||
await provider._handleProactiveSuggestion(data.context);
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user