Astra v2.2.41: /benchmark LLM 4-lens synthesis + Datacollect settings

- /benchmark now runs the full scan -> LLM 3-stage 4-lens synthesis ->
  markdown report pipeline, matching the Datacollect web app output
- Add settings: datacollectSynthesisTemperature (0.1), datacollectCrawlDepth,
  datacollectMaxPages, datacollectSavePath; new "Datacollect" Settings section
- Fix slash result not rendering (missing streamStart) and /benchmark URL
  parsing when natural language is appended
- Rename view container/view ids to g1nation-* to avoid conflict with the
  Antigravity built-in "Connect AI" extension
- Version bump 2.2.34 -> 2.2.41

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 13:22:26 +09:00
parent fce6938e1c
commit 9e7c7fe605
13 changed files with 666 additions and 59 deletions
@@ -83,6 +83,14 @@ interface SettingsState {
maxAutoSteps: number;
maxContextSize: number;
};
datacollect: {
bridgeUrl: string;
/** Empty → results saved to the Bridge's WIKI_RAW_PATH default. */
savePath: string;
crawlDepth: number;
maxPages: number;
synthesisTemperature: number;
};
google: {
clientId: string;
/** secret 자체는 client 에 echo 안 함 — *설정 여부* 만. true 면 input placeholder 가 "저장됨" 으로 바뀜. */
@@ -237,6 +245,9 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider {
case 'advanced.update':
await this._handleAdvancedUpdate(msg);
return;
case 'datacollect.update':
await this._handleDatacollectUpdate(msg);
return;
case 'google.update':
await this._handleGoogleUpdate(msg);
return;
@@ -572,6 +583,28 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider {
}
}
// ────────────── Datacollect (slash 명령) ──────────────
// /research·/benchmark·/youtube 가 호출하는 Bridge URL 과, 결과물 저장 위치.
// savePath 가 비어 있으면 Bridge 의 WIKI_RAW_PATH 환경변수가 저장 위치를 결정한다.
private async _handleDatacollectUpdate(msg: any): Promise<void> {
if (typeof msg.bridgeUrl === 'string') {
await this._safeConfigUpdate('datacollectBridgeUrl', msg.bridgeUrl.trim());
}
if (typeof msg.savePath === 'string') {
await this._safeConfigUpdate('datacollectSavePath', msg.savePath.trim());
}
if (typeof msg.crawlDepth === 'number' && Number.isFinite(msg.crawlDepth)) {
await this._safeConfigUpdate('datacollectCrawlDepth', Math.max(0, Math.min(3, Math.floor(msg.crawlDepth))));
}
if (typeof msg.maxPages === 'number' && Number.isFinite(msg.maxPages)) {
await this._safeConfigUpdate('datacollectMaxPages', Math.max(1, Math.min(20, Math.floor(msg.maxPages))));
}
if (typeof msg.synthesisTemperature === 'number' && Number.isFinite(msg.synthesisTemperature)) {
await this._safeConfigUpdate('datacollectSynthesisTemperature', Math.max(0, Math.min(2, msg.synthesisTemperature)));
}
}
private async _refreshState(): Promise<void> {
if (!this._view && !this._panel) return;
const cfg = vscode.workspace.getConfiguration('g1nation');
@@ -620,6 +653,13 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider {
maxAutoSteps: cfg.get<number>('maxAutoSteps', 50) ?? 50,
maxContextSize: cfg.get<number>('maxContextSize', 32000) ?? 32000,
},
datacollect: {
bridgeUrl: cfg.get<string>('datacollectBridgeUrl', '') || '',
savePath: cfg.get<string>('datacollectSavePath', '') || '',
crawlDepth: cfg.get<number>('datacollectCrawlDepth', 1) ?? 1,
maxPages: cfg.get<number>('datacollectMaxPages', 8) ?? 8,
synthesisTemperature: cfg.get<number>('datacollectSynthesisTemperature', 0.1) ?? 0.1,
},
google: this._buildGoogleState(),
providers: await this._buildProvidersState(),
devilAgent: { enabled: cfg.get<boolean>('devilAgent.enabled', false) },