@su-record/vibe 2.5.12 → 2.5.13
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/commands/vibe.analyze.md +3 -3
- package/commands/vibe.review.md +3 -3
- package/commands/vibe.run.md +75 -9
- package/commands/vibe.spec.md +7 -7
- package/commands/vibe.utils.md +62 -5
- package/dist/cli/setup/GlobalInstaller.d.ts +24 -0
- package/dist/cli/setup/GlobalInstaller.d.ts.map +1 -0
- package/dist/cli/setup/GlobalInstaller.js +130 -0
- package/dist/cli/setup/GlobalInstaller.js.map +1 -0
- package/dist/cli/setup/LanguageDetector.d.ts +16 -0
- package/dist/cli/setup/LanguageDetector.d.ts.map +1 -0
- package/dist/cli/setup/LanguageDetector.js +49 -0
- package/dist/cli/setup/LanguageDetector.js.map +1 -0
- package/dist/cli/setup/LegacyMigration.d.ts +25 -0
- package/dist/cli/setup/LegacyMigration.d.ts.map +1 -0
- package/dist/cli/setup/LegacyMigration.js +162 -0
- package/dist/cli/setup/LegacyMigration.js.map +1 -0
- package/dist/cli/setup/ProjectSetup.d.ts +30 -0
- package/dist/cli/setup/ProjectSetup.d.ts.map +1 -0
- package/dist/cli/setup/ProjectSetup.js +238 -0
- package/dist/cli/setup/ProjectSetup.js.map +1 -0
- package/dist/cli/setup/index.d.ts +14 -0
- package/dist/cli/setup/index.d.ts.map +1 -0
- package/dist/cli/setup/index.js +18 -0
- package/dist/cli/setup/index.js.map +1 -0
- package/dist/cli/setup.d.ts +10 -77
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +15 -592
- package/dist/cli/setup.js.map +1 -1
- package/dist/lib/llm/auth/ApiKeyManager.d.ts +21 -0
- package/dist/lib/llm/auth/ApiKeyManager.d.ts.map +1 -0
- package/dist/lib/llm/auth/ApiKeyManager.js +43 -0
- package/dist/lib/llm/auth/ApiKeyManager.js.map +1 -0
- package/dist/lib/llm/auth/ConfigManager.d.ts +29 -0
- package/dist/lib/llm/auth/ConfigManager.d.ts.map +1 -0
- package/dist/lib/llm/auth/ConfigManager.js +67 -0
- package/dist/lib/llm/auth/ConfigManager.js.map +1 -0
- package/dist/lib/llm/auth/index.d.ts +25 -0
- package/dist/lib/llm/auth/index.d.ts.map +1 -0
- package/dist/lib/llm/auth/index.js +83 -0
- package/dist/lib/llm/auth/index.js.map +1 -0
- package/dist/lib/llm/index.d.ts +10 -0
- package/dist/lib/llm/index.d.ts.map +1 -0
- package/dist/lib/llm/index.js +12 -0
- package/dist/lib/llm/index.js.map +1 -0
- package/dist/lib/llm/types.d.ts +96 -0
- package/dist/lib/llm/types.d.ts.map +1 -0
- package/dist/lib/llm/types.js +17 -0
- package/dist/lib/llm/types.js.map +1 -0
- package/dist/lib/llm/utils/index.d.ts +6 -0
- package/dist/lib/llm/utils/index.d.ts.map +1 -0
- package/dist/lib/llm/utils/index.js +6 -0
- package/dist/lib/llm/utils/index.js.map +1 -0
- package/dist/lib/llm/utils/retry.d.ts +25 -0
- package/dist/lib/llm/utils/retry.d.ts.map +1 -0
- package/dist/lib/llm/utils/retry.js +72 -0
- package/dist/lib/llm/utils/retry.js.map +1 -0
- package/dist/lib/llm/utils/stream.d.ts +13 -0
- package/dist/lib/llm/utils/stream.d.ts.map +1 -0
- package/dist/lib/llm/utils/stream.js +110 -0
- package/dist/lib/llm/utils/stream.js.map +1 -0
- package/dist/orchestrator/AgentExecutor.d.ts +23 -0
- package/dist/orchestrator/AgentExecutor.d.ts.map +1 -0
- package/dist/orchestrator/AgentExecutor.js +231 -0
- package/dist/orchestrator/AgentExecutor.js.map +1 -0
- package/dist/orchestrator/AgentManager.d.ts +73 -0
- package/dist/orchestrator/AgentManager.d.ts.map +1 -0
- package/dist/orchestrator/AgentManager.js +184 -0
- package/dist/orchestrator/AgentManager.js.map +1 -0
- package/dist/orchestrator/LLMCluster.d.ts +70 -0
- package/dist/orchestrator/LLMCluster.d.ts.map +1 -0
- package/dist/orchestrator/LLMCluster.js +91 -0
- package/dist/orchestrator/LLMCluster.js.map +1 -0
- package/dist/orchestrator/MultiLlmResearch.d.ts +27 -0
- package/dist/orchestrator/MultiLlmResearch.d.ts.map +1 -0
- package/dist/orchestrator/MultiLlmResearch.js +145 -0
- package/dist/orchestrator/MultiLlmResearch.js.map +1 -0
- package/dist/orchestrator/SessionStore.d.ts +41 -0
- package/dist/orchestrator/SessionStore.d.ts.map +1 -0
- package/dist/orchestrator/SessionStore.js +117 -0
- package/dist/orchestrator/SessionStore.js.map +1 -0
- package/dist/orchestrator/SmartRouter.d.ts +68 -0
- package/dist/orchestrator/SmartRouter.d.ts.map +1 -0
- package/dist/orchestrator/SmartRouter.js +256 -0
- package/dist/orchestrator/SmartRouter.js.map +1 -0
- package/dist/orchestrator/backgroundAgent.d.ts +10 -27
- package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
- package/dist/orchestrator/backgroundAgent.js +11 -345
- package/dist/orchestrator/backgroundAgent.js.map +1 -1
- package/dist/orchestrator/index.d.ts +3 -0
- package/dist/orchestrator/index.d.ts.map +1 -1
- package/dist/orchestrator/index.js +4 -0
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +19 -154
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +90 -514
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/orchestrator/parallelResearch.d.ts +5 -12
- package/dist/orchestrator/parallelResearch.d.ts.map +1 -1
- package/dist/orchestrator/parallelResearch.js +10 -193
- package/dist/orchestrator/parallelResearch.js.map +1 -1
- package/hooks/scripts/generate-brand-assets.js +472 -0
- package/package.json +1 -1
- package/skills/brand-assets.md +141 -0
- package/skills/commerce-patterns.md +361 -0
- package/skills/e2e-commerce.md +304 -0
- package/skills/frontend-design.md +92 -0
- package/skills/seo-checklist.md +244 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMCluster - Multi-LLM 병렬 쿼리 및 상태 관리
|
|
3
|
+
* orchestrator.ts에서 추출된 LLM 클러스터 관리 모듈
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Multi-LLM 쿼리 결과
|
|
7
|
+
*/
|
|
8
|
+
export interface MultiLlmQueryResult {
|
|
9
|
+
gpt?: string;
|
|
10
|
+
gemini?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* LLM 상태 결과
|
|
14
|
+
*/
|
|
15
|
+
export interface LlmStatusResult {
|
|
16
|
+
gpt: {
|
|
17
|
+
available: boolean;
|
|
18
|
+
};
|
|
19
|
+
gemini: {
|
|
20
|
+
available: boolean;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* LLMCluster 설정
|
|
25
|
+
*/
|
|
26
|
+
export interface LLMClusterOptions {
|
|
27
|
+
defaultSystemPrompt?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* LLMCluster - GPT/Gemini 병렬 쿼리 및 상태 관리
|
|
31
|
+
*/
|
|
32
|
+
export declare class LLMCluster {
|
|
33
|
+
private defaultSystemPrompt;
|
|
34
|
+
constructor(options?: LLMClusterOptions);
|
|
35
|
+
/**
|
|
36
|
+
* GPT 오케스트레이션
|
|
37
|
+
*/
|
|
38
|
+
gptOrchestrate(prompt: string, systemPrompt?: string, options?: {
|
|
39
|
+
jsonMode?: boolean;
|
|
40
|
+
}): Promise<string>;
|
|
41
|
+
/**
|
|
42
|
+
* Gemini 오케스트레이션
|
|
43
|
+
*/
|
|
44
|
+
geminiOrchestrate(prompt: string, systemPrompt?: string, options?: {
|
|
45
|
+
jsonMode?: boolean;
|
|
46
|
+
}): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Gemini 웹 검색
|
|
49
|
+
*/
|
|
50
|
+
geminiWebSearch(query: string): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* GPT 웹 검색 (Gemini로 위임)
|
|
53
|
+
* @deprecated GPT Codex API는 웹 검색을 지원하지 않습니다. geminiWebSearch를 사용하세요.
|
|
54
|
+
*/
|
|
55
|
+
gptWebSearch(query: string): Promise<string>;
|
|
56
|
+
/**
|
|
57
|
+
* 멀티 LLM 병렬 쿼리
|
|
58
|
+
* GPT, Gemini 동시 호출하여 결과 비교
|
|
59
|
+
*/
|
|
60
|
+
multiQuery(prompt: string, options?: {
|
|
61
|
+
useGpt?: boolean;
|
|
62
|
+
useGemini?: boolean;
|
|
63
|
+
}): Promise<MultiLlmQueryResult>;
|
|
64
|
+
/**
|
|
65
|
+
* LLM 상태 확인 (전체)
|
|
66
|
+
*/
|
|
67
|
+
checkStatus(): Promise<LlmStatusResult>;
|
|
68
|
+
}
|
|
69
|
+
export declare function getLLMCluster(options?: LLMClusterOptions): LLMCluster;
|
|
70
|
+
//# sourceMappingURL=LLMCluster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMCluster.d.ts","sourceRoot":"","sources":["../../src/orchestrator/LLMCluster.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,mBAAmB,CAAS;gBAExB,OAAO,GAAE,iBAAsB;IAI3C;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD;;;OAGG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAClD,OAAO,CAAC,mBAAmB,CAAC;IA0B/B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;CAoB9C;AAKD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAKrE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMCluster - Multi-LLM 병렬 쿼리 및 상태 관리
|
|
3
|
+
* orchestrator.ts에서 추출된 LLM 클러스터 관리 모듈
|
|
4
|
+
*/
|
|
5
|
+
import * as gptApi from '../lib/gpt-api.js';
|
|
6
|
+
import * as geminiApi from '../lib/gemini-api.js';
|
|
7
|
+
import { warnLog } from '../lib/utils.js';
|
|
8
|
+
/**
|
|
9
|
+
* LLMCluster - GPT/Gemini 병렬 쿼리 및 상태 관리
|
|
10
|
+
*/
|
|
11
|
+
export class LLMCluster {
|
|
12
|
+
defaultSystemPrompt;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.defaultSystemPrompt = options.defaultSystemPrompt ?? 'You are a helpful assistant.';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* GPT 오케스트레이션
|
|
18
|
+
*/
|
|
19
|
+
async gptOrchestrate(prompt, systemPrompt, options) {
|
|
20
|
+
return gptApi.vibeGptOrchestrate(prompt, systemPrompt ?? this.defaultSystemPrompt, options);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Gemini 오케스트레이션
|
|
24
|
+
*/
|
|
25
|
+
async geminiOrchestrate(prompt, systemPrompt, options) {
|
|
26
|
+
return geminiApi.vibeGeminiOrchestrate(prompt, systemPrompt ?? this.defaultSystemPrompt, options);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Gemini 웹 검색
|
|
30
|
+
*/
|
|
31
|
+
async geminiWebSearch(query) {
|
|
32
|
+
return geminiApi.quickWebSearch(query);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* GPT 웹 검색 (Gemini로 위임)
|
|
36
|
+
* @deprecated GPT Codex API는 웹 검색을 지원하지 않습니다. geminiWebSearch를 사용하세요.
|
|
37
|
+
*/
|
|
38
|
+
async gptWebSearch(query) {
|
|
39
|
+
return this.geminiWebSearch(query);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 멀티 LLM 병렬 쿼리
|
|
43
|
+
* GPT, Gemini 동시 호출하여 결과 비교
|
|
44
|
+
*/
|
|
45
|
+
async multiQuery(prompt, options) {
|
|
46
|
+
const { useGpt = true, useGemini = true } = options || {};
|
|
47
|
+
const results = {};
|
|
48
|
+
const promises = [];
|
|
49
|
+
if (useGpt) {
|
|
50
|
+
promises.push(this.gptOrchestrate(prompt)
|
|
51
|
+
.then(r => { results.gpt = r; })
|
|
52
|
+
.catch(e => { warnLog('GPT query failed in multiLlm', e); }));
|
|
53
|
+
}
|
|
54
|
+
if (useGemini) {
|
|
55
|
+
promises.push(this.geminiOrchestrate(prompt)
|
|
56
|
+
.then(r => { results.gemini = r; })
|
|
57
|
+
.catch(e => { warnLog('Gemini query failed in multiLlm', e); }));
|
|
58
|
+
}
|
|
59
|
+
await Promise.all(promises);
|
|
60
|
+
return results;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* LLM 상태 확인 (전체)
|
|
64
|
+
*/
|
|
65
|
+
async checkStatus() {
|
|
66
|
+
let gptAvailable = false;
|
|
67
|
+
let geminiAvailable = false;
|
|
68
|
+
const promises = [
|
|
69
|
+
this.gptOrchestrate('ping', 'Reply with pong')
|
|
70
|
+
.then(() => { gptAvailable = true; })
|
|
71
|
+
.catch(e => { warnLog('GPT status check failed', e); }),
|
|
72
|
+
this.geminiOrchestrate('ping', 'Reply with pong')
|
|
73
|
+
.then(() => { geminiAvailable = true; })
|
|
74
|
+
.catch(e => { warnLog('Gemini status check failed', e); })
|
|
75
|
+
];
|
|
76
|
+
await Promise.all(promises);
|
|
77
|
+
return {
|
|
78
|
+
gpt: { available: gptAvailable },
|
|
79
|
+
gemini: { available: geminiAvailable }
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 싱글톤 인스턴스
|
|
84
|
+
let defaultCluster = null;
|
|
85
|
+
export function getLLMCluster(options) {
|
|
86
|
+
if (!defaultCluster || options) {
|
|
87
|
+
defaultCluster = new LLMCluster(options);
|
|
88
|
+
}
|
|
89
|
+
return defaultCluster;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=LLMCluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMCluster.js","sourceRoot":"","sources":["../../src/orchestrator/LLMCluster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MultiLlmResearch - GPT/Gemini 기반 Multi-LLM 리서치
|
|
3
|
+
* parallelResearch.ts에서 추출 (v2.6.0)
|
|
4
|
+
*/
|
|
5
|
+
import { MultiLlmResult } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Multi-LLM 리서치 프롬프트 생성
|
|
8
|
+
*/
|
|
9
|
+
export declare function createMultiLlmPrompts(feature: string, techStack: string[]): {
|
|
10
|
+
bestPractices: {
|
|
11
|
+
gpt: string;
|
|
12
|
+
gemini: string;
|
|
13
|
+
};
|
|
14
|
+
security: {
|
|
15
|
+
gpt: string;
|
|
16
|
+
gemini: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Multi-LLM 병렬 리서치 실행
|
|
21
|
+
*/
|
|
22
|
+
export declare function executeMultiLlmResearch(feature: string, techStack: string[]): Promise<MultiLlmResult[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Multi-LLM 결과 포맷팅
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatMultiLlmResults(results: MultiLlmResult[]): string;
|
|
27
|
+
//# sourceMappingURL=MultiLlmResearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiLlmResearch.d.ts","sourceRoot":"","sources":["../../src/orchestrator/MultiLlmResearch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK5C;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG;IAC3E,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,CAqBA;AAsCD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CA2E3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CA+BvE"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MultiLlmResearch - GPT/Gemini 기반 Multi-LLM 리서치
|
|
3
|
+
* parallelResearch.ts에서 추출 (v2.6.0)
|
|
4
|
+
*/
|
|
5
|
+
import { warnLog } from '../lib/utils.js';
|
|
6
|
+
import * as gptApi from '../lib/gpt-api.js';
|
|
7
|
+
import * as geminiApi from '../lib/gemini-api.js';
|
|
8
|
+
/**
|
|
9
|
+
* Multi-LLM 리서치 프롬프트 생성
|
|
10
|
+
*/
|
|
11
|
+
export function createMultiLlmPrompts(feature, techStack) {
|
|
12
|
+
const stackStr = techStack.length > 0 ? techStack.join(', ') : 'the project';
|
|
13
|
+
return {
|
|
14
|
+
bestPractices: {
|
|
15
|
+
gpt: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
16
|
+
Focus on: architecture patterns, code conventions, design patterns.
|
|
17
|
+
Return JSON: { patterns: string[], antiPatterns: string[], libraries: string[] }`,
|
|
18
|
+
gemini: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
19
|
+
Focus on: latest trends, framework updates, modern approaches.
|
|
20
|
+
Return JSON: { patterns: string[], antiPatterns: string[], libraries: string[] }`
|
|
21
|
+
},
|
|
22
|
+
security: {
|
|
23
|
+
gpt: `Security considerations for "${feature}" with ${stackStr}.
|
|
24
|
+
Focus on: CVE database, known vulnerabilities, exploit patterns.
|
|
25
|
+
Return JSON: { vulnerabilities: string[], mitigations: string[], checklist: string[] }`,
|
|
26
|
+
gemini: `Security advisories for "${feature}" with ${stackStr}.
|
|
27
|
+
Focus on: latest patches, recent incidents, security best practices.
|
|
28
|
+
Return JSON: { advisories: string[], patches: string[], incidents: string[] }`
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* GPT API 호출 (에러 처리 포함)
|
|
34
|
+
*/
|
|
35
|
+
async function callGptSafe(prompt, systemPrompt, jsonMode = true) {
|
|
36
|
+
try {
|
|
37
|
+
const result = await gptApi.vibeGptOrchestrate(prompt, systemPrompt, { jsonMode });
|
|
38
|
+
return { result, success: true };
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
42
|
+
warnLog('[Multi-LLM] GPT call failed:', errorMsg);
|
|
43
|
+
return { result: '', success: false, error: errorMsg };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Gemini API 호출 (에러 처리 포함)
|
|
48
|
+
*/
|
|
49
|
+
async function callGeminiSafe(prompt, systemPrompt, jsonMode = true) {
|
|
50
|
+
try {
|
|
51
|
+
const result = await geminiApi.vibeGeminiOrchestrate(prompt, systemPrompt, { jsonMode });
|
|
52
|
+
return { result, success: true };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
56
|
+
warnLog('[Multi-LLM] Gemini call failed:', errorMsg);
|
|
57
|
+
return { result: '', success: false, error: errorMsg };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Multi-LLM 병렬 리서치 실행
|
|
62
|
+
*/
|
|
63
|
+
export async function executeMultiLlmResearch(feature, techStack) {
|
|
64
|
+
const prompts = createMultiLlmPrompts(feature, techStack);
|
|
65
|
+
const results = [];
|
|
66
|
+
const promises = [];
|
|
67
|
+
// Best Practices - GPT
|
|
68
|
+
promises.push((async () => {
|
|
69
|
+
const taskStart = Date.now();
|
|
70
|
+
const { result, success, error } = await callGptSafe(prompts.bestPractices.gpt, 'You are an expert software architect. Provide best practices in JSON format.');
|
|
71
|
+
results.push({
|
|
72
|
+
provider: 'gpt',
|
|
73
|
+
category: 'best-practices',
|
|
74
|
+
result, success, error,
|
|
75
|
+
duration: Date.now() - taskStart
|
|
76
|
+
});
|
|
77
|
+
})());
|
|
78
|
+
// Best Practices - Gemini
|
|
79
|
+
promises.push((async () => {
|
|
80
|
+
const taskStart = Date.now();
|
|
81
|
+
const { result, success, error } = await callGeminiSafe(prompts.bestPractices.gemini, 'You are an expert in modern development trends. Provide best practices in JSON format.');
|
|
82
|
+
results.push({
|
|
83
|
+
provider: 'gemini',
|
|
84
|
+
category: 'best-practices',
|
|
85
|
+
result, success, error,
|
|
86
|
+
duration: Date.now() - taskStart
|
|
87
|
+
});
|
|
88
|
+
})());
|
|
89
|
+
// Security - GPT
|
|
90
|
+
promises.push((async () => {
|
|
91
|
+
const taskStart = Date.now();
|
|
92
|
+
const { result, success, error } = await callGptSafe(prompts.security.gpt, 'You are a security expert. Focus on CVE database and known vulnerabilities. Return JSON format.');
|
|
93
|
+
results.push({
|
|
94
|
+
provider: 'gpt',
|
|
95
|
+
category: 'security',
|
|
96
|
+
result, success, error,
|
|
97
|
+
duration: Date.now() - taskStart
|
|
98
|
+
});
|
|
99
|
+
})());
|
|
100
|
+
// Security - Gemini
|
|
101
|
+
promises.push((async () => {
|
|
102
|
+
const taskStart = Date.now();
|
|
103
|
+
const { result, success, error } = await callGeminiSafe(prompts.security.gemini, 'You are a security advisor. Focus on latest advisories and patches. Return JSON format.');
|
|
104
|
+
results.push({
|
|
105
|
+
provider: 'gemini',
|
|
106
|
+
category: 'security',
|
|
107
|
+
result, success, error,
|
|
108
|
+
duration: Date.now() - taskStart
|
|
109
|
+
});
|
|
110
|
+
})());
|
|
111
|
+
await Promise.all(promises);
|
|
112
|
+
return results;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Multi-LLM 결과 포맷팅
|
|
116
|
+
*/
|
|
117
|
+
export function formatMultiLlmResults(results) {
|
|
118
|
+
if (results.length === 0) {
|
|
119
|
+
return '[Multi-LLM] No results available';
|
|
120
|
+
}
|
|
121
|
+
const successCount = results.filter(r => r.success).length;
|
|
122
|
+
let output = `\n## Multi-LLM Research Results (${successCount}/${results.length} successful)\n\n`;
|
|
123
|
+
// Best Practices 섹션
|
|
124
|
+
const bestPractices = results.filter(r => r.category === 'best-practices');
|
|
125
|
+
if (bestPractices.length > 0) {
|
|
126
|
+
output += `### Best Practices\n\n`;
|
|
127
|
+
for (const bp of bestPractices) {
|
|
128
|
+
const status = bp.success ? '✅' : '❌';
|
|
129
|
+
output += `#### ${status} ${bp.provider.toUpperCase()} (${(bp.duration / 1000).toFixed(1)}s)\n`;
|
|
130
|
+
output += bp.success ? `${bp.result}\n\n` : `Error: ${bp.error}\n\n`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Security 섹션
|
|
134
|
+
const security = results.filter(r => r.category === 'security');
|
|
135
|
+
if (security.length > 0) {
|
|
136
|
+
output += `### Security Advisories\n\n`;
|
|
137
|
+
for (const sec of security) {
|
|
138
|
+
const status = sec.success ? '✅' : '❌';
|
|
139
|
+
output += `#### ${status} ${sec.provider.toUpperCase()} (${(sec.duration / 1000).toFixed(1)}s)\n`;
|
|
140
|
+
output += sec.success ? `${sec.result}\n\n` : `Error: ${sec.error}\n\n`;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return output;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=MultiLlmResearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiLlmResearch.js","sourceRoot":"","sources":["../../src/orchestrator/MultiLlmResearch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,SAAmB;IAIxE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAE7E,OAAO;QACL,aAAa,EAAE;YACb,GAAG,EAAE,oCAAoC,OAAO,UAAU,QAAQ;;iFAES;YAC3E,MAAM,EAAE,oCAAoC,OAAO,UAAU,QAAQ;;iFAEM;SAC5E;QACD,QAAQ,EAAE;YACR,GAAG,EAAE,gCAAgC,OAAO,UAAU,QAAQ;;uFAEmB;YACjF,MAAM,EAAE,4BAA4B,OAAO,UAAU,QAAQ;;8EAEW;SACzE;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CACxB,MAAc,EACd,YAAoB,EACpB,WAAoB,IAAI;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,8BAA8B,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,YAAoB,EACpB,WAAoB,IAAI;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,iCAAiC,EAAE,QAAQ,CAAC,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAe,EACf,SAAmB;IAEnB,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,uBAAuB;IACvB,QAAQ,CAAC,IAAI,CACX,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAClD,OAAO,CAAC,aAAa,CAAC,GAAG,EACzB,8EAA8E,CAC/E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,OAAO,EAAE,KAAK;YACtB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,EAAE,CACL,CAAC;IAEF,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,CACX,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CACrD,OAAO,CAAC,aAAa,CAAC,MAAM,EAC5B,wFAAwF,CACzF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,OAAO,EAAE,KAAK;YACtB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,EAAE,CACL,CAAC;IAEF,iBAAiB;IACjB,QAAQ,CAAC,IAAI,CACX,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,EACpB,iGAAiG,CAClG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,OAAO,EAAE,KAAK;YACtB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,EAAE,CACL,CAAC;IAEF,oBAAoB;IACpB,QAAQ,CAAC,IAAI,CACX,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,EACvB,yFAAyF,CAC1F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,OAAO,EAAE,KAAK;YACtB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,EAAE,CACL,CAAC;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAyB;IAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3D,IAAI,MAAM,GAAG,oCAAoC,YAAY,IAAI,OAAO,CAAC,MAAM,kBAAkB,CAAC;IAElG,oBAAoB;IACpB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,gBAAgB,CAAC,CAAC;IAC3E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,wBAAwB,CAAC;QACnC,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtC,MAAM,IAAI,QAAQ,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YAChG,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,MAAM,CAAC;QACvE,CAAC;IACH,CAAC;IAED,cAAc;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IAChE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,6BAA6B,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACvC,MAAM,IAAI,QAAQ,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YAClG,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,KAAK,MAAM,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionStore - 백그라운드 에이전트 세션 저장소
|
|
3
|
+
* backgroundAgent.ts에서 추출 (v2.6.0)
|
|
4
|
+
*/
|
|
5
|
+
import { BackgroundAgentHandle, AgentResult, SessionInfo } from './types.js';
|
|
6
|
+
import { ToolResult } from '../types/tool.js';
|
|
7
|
+
export interface SessionData {
|
|
8
|
+
handle: BackgroundAgentHandle;
|
|
9
|
+
resultPromise: Promise<AgentResult>;
|
|
10
|
+
cancelController: AbortController;
|
|
11
|
+
createdAt: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* SessionStore - 세션 저장 및 관리
|
|
15
|
+
*/
|
|
16
|
+
declare class SessionStoreImpl {
|
|
17
|
+
private activeSessions;
|
|
18
|
+
private sessionHistory;
|
|
19
|
+
private cleanupTimer;
|
|
20
|
+
constructor();
|
|
21
|
+
private startCleanupTimer;
|
|
22
|
+
private cleanup;
|
|
23
|
+
add(sessionId: string, data: SessionData): void;
|
|
24
|
+
get(sessionId: string): SessionData | undefined;
|
|
25
|
+
delete(sessionId: string): void;
|
|
26
|
+
addToHistory(info: SessionInfo): void;
|
|
27
|
+
findInHistory(sessionId: string): SessionInfo | undefined;
|
|
28
|
+
getActiveSessions(): SessionData[];
|
|
29
|
+
getRecentHistory(limit: number): SessionInfo[];
|
|
30
|
+
}
|
|
31
|
+
export declare const sessionStore: SessionStoreImpl;
|
|
32
|
+
/**
|
|
33
|
+
* 활성 세션 목록 조회
|
|
34
|
+
*/
|
|
35
|
+
export declare function listActiveSessions(): ToolResult;
|
|
36
|
+
/**
|
|
37
|
+
* 세션 히스토리 조회
|
|
38
|
+
*/
|
|
39
|
+
export declare function getSessionHistory(limit?: number): ToolResult;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=SessionStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionStore.d.ts","sourceRoot":"","sources":["../../src/orchestrator/SessionStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACpC,gBAAgB,EAAE,eAAe,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;GAEG;AACH,cAAM,gBAAgB;IACpB,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,YAAY,CAA+C;;IAMnE,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,OAAO;IAoBf,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI;IAI/C,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI/C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/B,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAIrC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIzD,iBAAiB,IAAI,WAAW,EAAE;IAIlC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE;CAG/C;AAGD,eAAO,MAAM,YAAY,kBAAyB,CAAC;AAEnD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,UAAU,CAyB/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,MAAW,GAAG,UAAU,CAsBhE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionStore - 백그라운드 에이전트 세션 저장소
|
|
3
|
+
* backgroundAgent.ts에서 추출 (v2.6.0)
|
|
4
|
+
*/
|
|
5
|
+
// TTL 설정
|
|
6
|
+
const SESSION_TTL = 60 * 60 * 1000; // 1시간
|
|
7
|
+
const SESSION_HISTORY_TTL = 24 * 60 * 60 * 1000; // 24시간
|
|
8
|
+
const CLEANUP_INTERVAL = 10 * 60 * 1000; // 10분
|
|
9
|
+
/**
|
|
10
|
+
* SessionStore - 세션 저장 및 관리
|
|
11
|
+
*/
|
|
12
|
+
class SessionStoreImpl {
|
|
13
|
+
activeSessions = new Map();
|
|
14
|
+
sessionHistory = [];
|
|
15
|
+
cleanupTimer = null;
|
|
16
|
+
constructor() {
|
|
17
|
+
this.startCleanupTimer();
|
|
18
|
+
}
|
|
19
|
+
startCleanupTimer() {
|
|
20
|
+
if (this.cleanupTimer)
|
|
21
|
+
return;
|
|
22
|
+
this.cleanupTimer = setInterval(() => this.cleanup(), CLEANUP_INTERVAL);
|
|
23
|
+
if (this.cleanupTimer.unref) {
|
|
24
|
+
this.cleanupTimer.unref();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
cleanup() {
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
// 활성 세션 정리
|
|
30
|
+
for (const [sessionId, session] of this.activeSessions.entries()) {
|
|
31
|
+
if (now - session.createdAt > SESSION_TTL) {
|
|
32
|
+
if (session.handle.status === 'running') {
|
|
33
|
+
session.cancelController.abort();
|
|
34
|
+
}
|
|
35
|
+
this.activeSessions.delete(sessionId);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// 히스토리 정리
|
|
39
|
+
const cutoff = now - SESSION_HISTORY_TTL;
|
|
40
|
+
while (this.sessionHistory.length > 0 && this.sessionHistory[0].startTime < cutoff) {
|
|
41
|
+
this.sessionHistory.shift();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
add(sessionId, data) {
|
|
45
|
+
this.activeSessions.set(sessionId, data);
|
|
46
|
+
}
|
|
47
|
+
get(sessionId) {
|
|
48
|
+
return this.activeSessions.get(sessionId);
|
|
49
|
+
}
|
|
50
|
+
delete(sessionId) {
|
|
51
|
+
this.activeSessions.delete(sessionId);
|
|
52
|
+
}
|
|
53
|
+
addToHistory(info) {
|
|
54
|
+
this.sessionHistory.push(info);
|
|
55
|
+
}
|
|
56
|
+
findInHistory(sessionId) {
|
|
57
|
+
return this.sessionHistory.find(s => s.sessionId === sessionId);
|
|
58
|
+
}
|
|
59
|
+
getActiveSessions() {
|
|
60
|
+
return Array.from(this.activeSessions.values());
|
|
61
|
+
}
|
|
62
|
+
getRecentHistory(limit) {
|
|
63
|
+
return this.sessionHistory.slice(-limit).reverse();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// 싱글톤 인스턴스
|
|
67
|
+
export const sessionStore = new SessionStoreImpl();
|
|
68
|
+
/**
|
|
69
|
+
* 활성 세션 목록 조회
|
|
70
|
+
*/
|
|
71
|
+
export function listActiveSessions() {
|
|
72
|
+
const sessions = sessionStore.getActiveSessions().map(s => ({
|
|
73
|
+
sessionId: s.handle.sessionId,
|
|
74
|
+
agentName: s.handle.agentName,
|
|
75
|
+
status: s.handle.status,
|
|
76
|
+
startTime: new Date(s.handle.startTime).toISOString(),
|
|
77
|
+
runningFor: `${((Date.now() - s.handle.startTime) / 1000).toFixed(0)}s`
|
|
78
|
+
}));
|
|
79
|
+
if (sessions.length === 0) {
|
|
80
|
+
return {
|
|
81
|
+
content: [{ type: 'text', text: 'No active background agents' }]
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
let summary = `## Active Background Agents (${sessions.length})\n\n`;
|
|
85
|
+
for (const session of sessions) {
|
|
86
|
+
summary += `- **${session.agentName}** (${session.sessionId})\n`;
|
|
87
|
+
summary += ` Status: ${session.status} | Running: ${session.runningFor}\n`;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
content: [{ type: 'text', text: summary }],
|
|
91
|
+
sessions
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 세션 히스토리 조회
|
|
96
|
+
*/
|
|
97
|
+
export function getSessionHistory(limit = 10) {
|
|
98
|
+
const recent = sessionStore.getRecentHistory(limit);
|
|
99
|
+
if (recent.length === 0) {
|
|
100
|
+
return {
|
|
101
|
+
content: [{ type: 'text', text: 'No session history' }]
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
let summary = `## Session History (last ${recent.length})\n\n`;
|
|
105
|
+
for (const session of recent) {
|
|
106
|
+
const duration = session.endTime
|
|
107
|
+
? `${((session.endTime - session.startTime) / 1000).toFixed(1)}s`
|
|
108
|
+
: 'N/A';
|
|
109
|
+
summary += `- **${session.agentName}** (${session.sessionId})\n`;
|
|
110
|
+
summary += ` Status: ${session.status} | Duration: ${duration}\n`;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
content: [{ type: 'text', text: summary }],
|
|
114
|
+
history: recent
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=SessionStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionStore.js","sourceRoot":"","sources":["../../src/orchestrator/SessionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SmartRouter - LLM 스마트 라우팅 및 fallback 관리
|
|
3
|
+
* orchestrator.ts에서 추출된 라우팅 전용 모듈
|
|
4
|
+
*/
|
|
5
|
+
import { SmartRouteRequest, SmartRouteResult, LLMAvailabilityCache } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* SmartRouter 설정
|
|
8
|
+
*/
|
|
9
|
+
export interface SmartRouterOptions {
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* SmartRouter - Task 유형별 최적 LLM 선택 + fallback chain
|
|
14
|
+
*/
|
|
15
|
+
export declare class SmartRouter {
|
|
16
|
+
private cache;
|
|
17
|
+
private verbose;
|
|
18
|
+
constructor(options?: SmartRouterOptions);
|
|
19
|
+
/**
|
|
20
|
+
* 스마트 라우팅 - 작업 유형에 따라 최적의 LLM 선택 + fallback
|
|
21
|
+
*/
|
|
22
|
+
route(request: SmartRouteRequest): Promise<SmartRouteResult>;
|
|
23
|
+
/**
|
|
24
|
+
* LLM 우선순위 결정
|
|
25
|
+
*/
|
|
26
|
+
private getProviderPriority;
|
|
27
|
+
/**
|
|
28
|
+
* LLM 호출
|
|
29
|
+
*/
|
|
30
|
+
private callLlm;
|
|
31
|
+
/**
|
|
32
|
+
* 재시도 없이 즉시 다음 LLM으로 넘어가야 하는 에러
|
|
33
|
+
*/
|
|
34
|
+
private shouldSkipRetry;
|
|
35
|
+
/**
|
|
36
|
+
* LLM 가용성 확인 (캐시 기반)
|
|
37
|
+
*/
|
|
38
|
+
private isUnavailable;
|
|
39
|
+
/**
|
|
40
|
+
* LLM 가용 상태로 마킹
|
|
41
|
+
*/
|
|
42
|
+
private markAvailable;
|
|
43
|
+
/**
|
|
44
|
+
* LLM 불가용 상태로 마킹
|
|
45
|
+
*/
|
|
46
|
+
private markUnavailable;
|
|
47
|
+
/**
|
|
48
|
+
* Fallback 메시지 생성
|
|
49
|
+
*/
|
|
50
|
+
private buildFallbackMessage;
|
|
51
|
+
private delay;
|
|
52
|
+
webSearch(query: string): Promise<SmartRouteResult>;
|
|
53
|
+
architectureReview(prompt: string): Promise<SmartRouteResult>;
|
|
54
|
+
uiuxReview(prompt: string): Promise<SmartRouteResult>;
|
|
55
|
+
codeAnalysis(prompt: string): Promise<SmartRouteResult>;
|
|
56
|
+
debugging(prompt: string): Promise<SmartRouteResult>;
|
|
57
|
+
codeGen(description: string, context?: string): Promise<SmartRouteResult>;
|
|
58
|
+
/**
|
|
59
|
+
* 캐시 상태 조회 (디버깅용)
|
|
60
|
+
*/
|
|
61
|
+
getCacheStatus(): LLMAvailabilityCache;
|
|
62
|
+
/**
|
|
63
|
+
* 캐시 초기화
|
|
64
|
+
*/
|
|
65
|
+
resetCache(): void;
|
|
66
|
+
}
|
|
67
|
+
export declare function getSmartRouter(options?: SmartRouterOptions): SmartRouter;
|
|
68
|
+
//# sourceMappingURL=SmartRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SmartRouter.d.ts","sourceRoot":"","sources":["../../src/orchestrator/SmartRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAQpB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,kBAAuB;IAQ5C;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0ElE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;YACW,OAAO;IAiBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,KAAK;IAQP,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQnD,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQ7D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQrD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQvD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQpD,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAS/E;;OAEG;IACH,cAAc,IAAI,oBAAoB;IAItC;;OAEG;IACH,UAAU,IAAI,IAAI;CAMnB;AAKD,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAKxE"}
|