release: v2.0.1 - Advanced Knowledge Mix & Architectural Intelligence

This commit is contained in:
g1nation
2026-05-13 22:05:39 +09:00
parent c32b17377b
commit e85e11aac6
23 changed files with 1758 additions and 78 deletions
+20 -2
View File
@@ -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 0100.
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',
+47
View File
@@ -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;