@su-record/vibe 2.12.3 → 2.12.5
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/CLAUDE.md +15 -13
- package/README.md +2 -0
- package/dist/cli/collaborator.d.ts.map +1 -1
- package/dist/cli/collaborator.js +23 -6
- package/dist/cli/collaborator.js.map +1 -1
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +26 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/postinstall/claude-agents.d.ts +11 -1
- package/dist/cli/postinstall/claude-agents.d.ts.map +1 -1
- package/dist/cli/postinstall/claude-agents.js +37 -14
- package/dist/cli/postinstall/claude-agents.js.map +1 -1
- package/dist/cli/postinstall/constants.d.ts +20 -2
- package/dist/cli/postinstall/constants.d.ts.map +1 -1
- package/dist/cli/postinstall/constants.js +52 -2
- package/dist/cli/postinstall/constants.js.map +1 -1
- package/dist/cli/postinstall/fs-utils.d.ts +5 -0
- package/dist/cli/postinstall/fs-utils.d.ts.map +1 -1
- package/dist/cli/postinstall/fs-utils.js +55 -0
- package/dist/cli/postinstall/fs-utils.js.map +1 -1
- package/dist/cli/postinstall/fs-utils.test.d.ts +2 -0
- package/dist/cli/postinstall/fs-utils.test.d.ts.map +1 -0
- package/dist/cli/postinstall/fs-utils.test.js +31 -0
- package/dist/cli/postinstall/fs-utils.test.js.map +1 -0
- package/dist/cli/postinstall/index.d.ts +2 -2
- package/dist/cli/postinstall/index.d.ts.map +1 -1
- package/dist/cli/postinstall/index.js +2 -2
- package/dist/cli/postinstall/index.js.map +1 -1
- package/dist/cli/postinstall/main.d.ts.map +1 -1
- package/dist/cli/postinstall/main.js +9 -6
- package/dist/cli/postinstall/main.js.map +1 -1
- package/dist/cli/postinstall.d.ts +1 -1
- package/dist/cli/postinstall.d.ts.map +1 -1
- package/dist/cli/postinstall.js +1 -1
- package/dist/cli/postinstall.js.map +1 -1
- package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
- package/dist/cli/setup/ProjectSetup.js +13 -1
- package/dist/cli/setup/ProjectSetup.js.map +1 -1
- package/dist/infra/lib/ContextCompressor.d.ts +11 -2
- package/dist/infra/lib/ContextCompressor.d.ts.map +1 -1
- package/dist/infra/lib/ContextCompressor.js +26 -41
- package/dist/infra/lib/ContextCompressor.js.map +1 -1
- package/dist/infra/lib/ContextCompressor.test.d.ts +2 -0
- package/dist/infra/lib/ContextCompressor.test.d.ts.map +1 -0
- package/dist/infra/lib/ContextCompressor.test.js +25 -0
- package/dist/infra/lib/ContextCompressor.test.js.map +1 -0
- package/dist/infra/lib/CostAccumulator.d.ts +19 -2
- package/dist/infra/lib/CostAccumulator.d.ts.map +1 -1
- package/dist/infra/lib/CostAccumulator.js +60 -2
- package/dist/infra/lib/CostAccumulator.js.map +1 -1
- package/dist/infra/lib/antigravity/chat.d.ts.map +1 -1
- package/dist/infra/lib/antigravity/chat.js +6 -0
- package/dist/infra/lib/antigravity/chat.js.map +1 -1
- package/dist/infra/lib/antigravity/orchestration.d.ts.map +1 -1
- package/dist/infra/lib/antigravity/orchestration.js +13 -1
- package/dist/infra/lib/antigravity/orchestration.js.map +1 -1
- package/dist/infra/lib/antigravity/types.d.ts +8 -0
- package/dist/infra/lib/antigravity/types.d.ts.map +1 -1
- package/dist/infra/lib/embedding/VectorStore.d.ts +9 -2
- package/dist/infra/lib/embedding/VectorStore.d.ts.map +1 -1
- package/dist/infra/lib/embedding/VectorStore.js +42 -19
- package/dist/infra/lib/embedding/VectorStore.js.map +1 -1
- package/dist/infra/lib/gpt/auth.d.ts.map +1 -1
- package/dist/infra/lib/gpt/auth.js +13 -1
- package/dist/infra/lib/gpt/auth.js.map +1 -1
- package/dist/infra/lib/gpt/chat.d.ts.map +1 -1
- package/dist/infra/lib/gpt/chat.js +52 -31
- package/dist/infra/lib/gpt/chat.js.map +1 -1
- package/dist/infra/lib/gpt/embedding.d.ts.map +1 -1
- package/dist/infra/lib/gpt/embedding.js +6 -5
- package/dist/infra/lib/gpt/embedding.js.map +1 -1
- package/dist/infra/lib/gpt/orchestration.d.ts.map +1 -1
- package/dist/infra/lib/gpt/orchestration.js +13 -1
- package/dist/infra/lib/gpt/orchestration.js.map +1 -1
- package/dist/infra/lib/gpt/types.d.ts +8 -0
- package/dist/infra/lib/gpt/types.d.ts.map +1 -1
- package/dist/infra/lib/llm/timeout.d.ts +34 -0
- package/dist/infra/lib/llm/timeout.d.ts.map +1 -0
- package/dist/infra/lib/llm/timeout.js +45 -0
- package/dist/infra/lib/llm/timeout.js.map +1 -0
- package/dist/infra/lib/llm/timeout.test.d.ts +2 -0
- package/dist/infra/lib/llm/timeout.test.d.ts.map +1 -0
- package/dist/infra/lib/llm/timeout.test.js +50 -0
- package/dist/infra/lib/llm/timeout.test.js.map +1 -0
- package/dist/infra/lib/memory/MemoryStorage.d.ts +12 -0
- package/dist/infra/lib/memory/MemoryStorage.d.ts.map +1 -1
- package/dist/infra/lib/memory/MemoryStorage.js +57 -0
- package/dist/infra/lib/memory/MemoryStorage.js.map +1 -1
- package/dist/infra/lib/memory/ReflectionStore.d.ts.map +1 -1
- package/dist/infra/lib/memory/ReflectionStore.js +8 -27
- package/dist/infra/lib/memory/ReflectionStore.js.map +1 -1
- package/dist/infra/orchestrator/AgentExecutor.d.ts.map +1 -1
- package/dist/infra/orchestrator/AgentExecutor.js +3 -1
- package/dist/infra/orchestrator/AgentExecutor.js.map +1 -1
- package/dist/infra/orchestrator/LLMCluster.d.ts +4 -0
- package/dist/infra/orchestrator/LLMCluster.d.ts.map +1 -1
- package/dist/infra/orchestrator/LLMCluster.js +39 -3
- package/dist/infra/orchestrator/LLMCluster.js.map +1 -1
- package/dist/infra/orchestrator/MultiLlmResearch.d.ts +5 -0
- package/dist/infra/orchestrator/MultiLlmResearch.d.ts.map +1 -1
- package/dist/infra/orchestrator/MultiLlmResearch.js +7 -0
- package/dist/infra/orchestrator/MultiLlmResearch.js.map +1 -1
- package/dist/infra/orchestrator/PhasePipeline.d.ts +5 -5
- package/dist/infra/orchestrator/PhasePipeline.d.ts.map +1 -1
- package/dist/infra/orchestrator/PhasePipeline.js +19 -15
- package/dist/infra/orchestrator/PhasePipeline.js.map +1 -1
- package/dist/infra/orchestrator/SmartRouter.d.ts +10 -0
- package/dist/infra/orchestrator/SmartRouter.d.ts.map +1 -1
- package/dist/infra/orchestrator/SmartRouter.js +23 -6
- package/dist/infra/orchestrator/SmartRouter.js.map +1 -1
- package/dist/infra/orchestrator/SmartRouter.test.js +46 -19
- package/dist/infra/orchestrator/SmartRouter.test.js.map +1 -1
- package/dist/infra/orchestrator/parallelResearch.d.ts.map +1 -1
- package/dist/infra/orchestrator/parallelResearch.js +41 -9
- package/dist/infra/orchestrator/parallelResearch.js.map +1 -1
- package/hooks/hooks.json +2 -9
- package/hooks/scripts/__tests__/keyword-detector.test.js +51 -16
- package/hooks/scripts/auto-commit.js +17 -17
- package/hooks/scripts/auto-format.js +11 -6
- package/hooks/scripts/code-check.js +17 -20
- package/hooks/scripts/codex-hook-adapter.js +5 -1
- package/hooks/scripts/keyword-detector.js +14 -2
- package/hooks/scripts/llm-orchestrate.js +13 -2
- package/hooks/scripts/prompt-dispatcher.js +32 -9
- package/hooks/scripts/session-start.js +28 -15
- package/hooks/scripts/utils.js +33 -9
- package/package.json +1 -1
- package/skills/arch-guard/SKILL.md +2 -2
- package/skills/characterization-test/SKILL.md +2 -2
- package/skills/design-audit/SKILL.md +1 -0
- package/skills/design-normalize/SKILL.md +1 -0
- package/skills/design-teach/SKILL.md +1 -1
- package/skills/exec-plan/SKILL.md +2 -2
- package/skills/spec/SKILL.md +6 -312
- package/skills/spec/references/askuser-examples.md +57 -0
- package/skills/spec/references/example-session.md +87 -0
- package/skills/spec/references/templates.md +189 -0
- package/skills/test/SKILL.md +9 -9
- package/skills/ui-ux-pro-max/SKILL.md +1 -0
- package/skills/vibe.run/SKILL.md +5 -5
- package/skills/vibe.test/SKILL.md +1 -1
- package/skills/vibe.verify/SKILL.md +1 -1
- package/vibe/rules/standards/complexity-metrics.md +2 -2
- package/vibe/templates/claudemd-template.md +1 -1
|
@@ -38,11 +38,15 @@ export class ContextCompressor {
|
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
40
|
const chunks = this.splitIntoChunks(context);
|
|
41
|
-
const scoredChunks = chunks.map(chunk => this.scoreChunk(chunk));
|
|
41
|
+
const scoredChunks = chunks.map((chunk, i) => this.scoreChunk(chunk, i));
|
|
42
42
|
// WHY 1.2x threshold (not 1.0x): Avoids wasteful compression when the content
|
|
43
43
|
// is only marginally over the target — the scoring/reordering overhead would
|
|
44
|
-
// degrade readability for negligible size savings.
|
|
45
|
-
|
|
44
|
+
// degrade readability for negligible size savings. context.length is in CHARS,
|
|
45
|
+
// targetTokens in tokens, so normalize via TOKENS_PER_CHAR_ESTIMATE (4 chars/token)
|
|
46
|
+
// before comparing — otherwise the early exit fires at ~30% of the real budget
|
|
47
|
+
// and in-budget content gets needlessly rechunked (breaking KV prefix-cache reuse).
|
|
48
|
+
const targetCharsWithMargin = (targetTokens / ContextCompressor.TOKENS_PER_CHAR_ESTIMATE) * 1.2;
|
|
49
|
+
if (context.length <= targetCharsWithMargin) {
|
|
46
50
|
return {
|
|
47
51
|
compressed: context,
|
|
48
52
|
originalSize: context.length,
|
|
@@ -76,6 +80,9 @@ export class ContextCompressor {
|
|
|
76
80
|
removed.push(this.summarizeChunk(chunk));
|
|
77
81
|
}
|
|
78
82
|
}
|
|
83
|
+
// Emit in original document order (not score order) so a recompressed,
|
|
84
|
+
// grown context keeps a stable prefix — preserving KV prefix-cache reuse.
|
|
85
|
+
selected.sort((a, b) => a.index - b.index);
|
|
79
86
|
// Reconstruct compressed context
|
|
80
87
|
const compressed = this.reconstructContext(selected, removed);
|
|
81
88
|
// Calculate retention statistics
|
|
@@ -135,15 +142,16 @@ export class ContextCompressor {
|
|
|
135
142
|
/**
|
|
136
143
|
* Score chunk importance (0-100)
|
|
137
144
|
* @param text - Text chunk to score
|
|
138
|
-
* @
|
|
145
|
+
* @param index - Original position of the chunk in the source document
|
|
146
|
+
* @returns Scored chunk with type, keywords, and original index
|
|
139
147
|
*/
|
|
140
|
-
static scoreChunk(text) {
|
|
148
|
+
static scoreChunk(text, index) {
|
|
141
149
|
const lowerText = text.toLowerCase();
|
|
142
150
|
const type = this.detectChunkType(lowerText, text);
|
|
143
151
|
const keywords = this.extractKeywords(lowerText);
|
|
144
152
|
const baseScore = this.calculateBaseScore(text, lowerText, type);
|
|
145
153
|
const finalScore = Math.max(ContextCompressor.MIN_SCORE, Math.min(ContextCompressor.MAX_SCORE, baseScore));
|
|
146
|
-
return { text, score: finalScore, type, keywords };
|
|
154
|
+
return { text, score: finalScore, type, keywords, index };
|
|
147
155
|
}
|
|
148
156
|
/**
|
|
149
157
|
* Detect chunk type based on content
|
|
@@ -242,48 +250,25 @@ export class ContextCompressor {
|
|
|
242
250
|
return `[${chunk.type}] ${summary}`;
|
|
243
251
|
}
|
|
244
252
|
/**
|
|
245
|
-
* Reconstruct compressed context
|
|
253
|
+
* Reconstruct compressed context.
|
|
254
|
+
*
|
|
255
|
+
* Chunks are emitted in their original document order (the caller sorts
|
|
256
|
+
* `selected` by index before calling). We intentionally do NOT regroup by
|
|
257
|
+
* type: reordering by score/type means a small change to the input reshuffles
|
|
258
|
+
* the whole output, destroying the common prefix between successive
|
|
259
|
+
* compactions and forcing a full KV-cache recompute. Preserving order keeps
|
|
260
|
+
* appended content at the tail so the prefix stays stable.
|
|
246
261
|
*/
|
|
247
262
|
static reconstructContext(selected, removed) {
|
|
248
|
-
// Group by type for better organization
|
|
249
|
-
const byType = {
|
|
250
|
-
code: [],
|
|
251
|
-
answer: [],
|
|
252
|
-
question: [],
|
|
253
|
-
explanation: [],
|
|
254
|
-
metadata: []
|
|
255
|
-
};
|
|
256
|
-
selected.forEach(chunk => {
|
|
257
|
-
byType[chunk.type].push(chunk);
|
|
258
|
-
});
|
|
259
263
|
const sections = [];
|
|
260
264
|
// Add header
|
|
261
265
|
sections.push('[Compressed Context - High Priority Information]\n');
|
|
262
|
-
//
|
|
263
|
-
if (
|
|
264
|
-
sections.push(
|
|
265
|
-
sections.push(byType.answer.map(c => c.text).join('\n\n'));
|
|
266
|
-
sections.push('');
|
|
267
|
-
}
|
|
268
|
-
// Add code blocks
|
|
269
|
-
if (byType.code.length > 0) {
|
|
270
|
-
sections.push('## Code Snippets');
|
|
271
|
-
sections.push(byType.code.map(c => c.text).join('\n\n'));
|
|
272
|
-
sections.push('');
|
|
273
|
-
}
|
|
274
|
-
// Add questions
|
|
275
|
-
if (byType.question.length > 0) {
|
|
276
|
-
sections.push('## Questions');
|
|
277
|
-
sections.push(byType.question.map(c => c.text).join('\n\n'));
|
|
278
|
-
sections.push('');
|
|
279
|
-
}
|
|
280
|
-
// Add explanations
|
|
281
|
-
if (byType.explanation.length > 0) {
|
|
282
|
-
sections.push('## Context');
|
|
283
|
-
sections.push(byType.explanation.map(c => c.text).join('\n\n'));
|
|
266
|
+
// Emit selected chunks in original order to keep the prefix stable.
|
|
267
|
+
if (selected.length > 0) {
|
|
268
|
+
sections.push(selected.map(c => c.text).join('\n\n'));
|
|
284
269
|
sections.push('');
|
|
285
270
|
}
|
|
286
|
-
// Add summary of removed sections
|
|
271
|
+
// Add summary of removed sections (low priority) at the tail
|
|
287
272
|
if (removed.length > 0) {
|
|
288
273
|
sections.push('## Removed Sections (Low Priority)');
|
|
289
274
|
sections.push(removed.join('\n'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextCompressor.js","sourceRoot":"","sources":["../../../src/infra/lib/ContextCompressor.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,+DAA+D;
|
|
1
|
+
{"version":3,"file":"ContextCompressor.js","sourceRoot":"","sources":["../../../src/infra/lib/ContextCompressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextCompressor.test.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/ContextCompressor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ContextCompressor } from './ContextCompressor.js';
|
|
3
|
+
describe('ContextCompressor.compress', () => {
|
|
4
|
+
it('returns content unchanged when within token budget (early exit)', () => {
|
|
5
|
+
// 4000 token target = 16,000 chars budget. 10,000 chars is well within it —
|
|
6
|
+
// must NOT be rechunked/compressed (would break KV prefix-cache reuse).
|
|
7
|
+
const content = 'const x = 1;\n'.repeat(770); // ~10,010 chars
|
|
8
|
+
const result = ContextCompressor.compress(content, 4000);
|
|
9
|
+
expect(result.compressed).toBe(content);
|
|
10
|
+
expect(result.compressionRatio).toBe(1);
|
|
11
|
+
expect(result.removedSections).toEqual([]);
|
|
12
|
+
});
|
|
13
|
+
it('compresses content exceeding the char-normalized budget', () => {
|
|
14
|
+
// 25,000 chars ≈ 6,250 tokens > 4,000 target * 1.2 margin → must compress
|
|
15
|
+
const content = 'some explanation text that goes on. '.repeat(700); // ~25,200 chars
|
|
16
|
+
const result = ContextCompressor.compress(content, 4000);
|
|
17
|
+
expect(result.compressedSize).toBeLessThan(result.originalSize);
|
|
18
|
+
});
|
|
19
|
+
it('handles empty context', () => {
|
|
20
|
+
const result = ContextCompressor.compress('', 4000);
|
|
21
|
+
expect(result.compressed).toBe('');
|
|
22
|
+
expect(result.originalSize).toBe(0);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=ContextCompressor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextCompressor.test.js","sourceRoot":"","sources":["../../../src/infra/lib/ContextCompressor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB;QAC9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,0EAA0E;QAC1E,MAAM,OAAO,GAAG,sCAAsC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB;QACpF,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CostAccumulator — JSONL 비용 로그
|
|
3
|
-
*
|
|
2
|
+
* CostAccumulator — JSONL 비용 로그 조회/기록 및 프로젝트별 예산 관리
|
|
3
|
+
* ~/.vibe/llm-costs.jsonl 을 읽고(조회/예산) 쓴다(logCost).
|
|
4
|
+
* hooks/scripts/utils.js 의 logLlmCost() 와 동일 포맷·경로를 공유한다 — hook CLI 호출과
|
|
5
|
+
* TS 직접 provider 호출이 같은 원장에 집계되어 cost telemetry 과소집계를 막는다 (B-8).
|
|
4
6
|
*/
|
|
5
7
|
export interface CostEntry {
|
|
6
8
|
ts: string;
|
|
@@ -36,6 +38,21 @@ export interface BudgetCheck {
|
|
|
36
38
|
level: 'ok' | 'alert' | 'blocking';
|
|
37
39
|
}
|
|
38
40
|
export declare class CostAccumulator {
|
|
41
|
+
/**
|
|
42
|
+
* TS 직접 provider 호출의 비용/지표를 JS logLlmCost 와 동일 포맷으로 기록한다 (B-8).
|
|
43
|
+
* 실패가 호출을 방해하지 않도록 모든 오류를 삼킨다.
|
|
44
|
+
*/
|
|
45
|
+
static logCost(opts: {
|
|
46
|
+
provider: string;
|
|
47
|
+
model: string;
|
|
48
|
+
inputLen: number;
|
|
49
|
+
outputLen: number;
|
|
50
|
+
durationMs: number;
|
|
51
|
+
cached?: boolean;
|
|
52
|
+
project?: string;
|
|
53
|
+
usedFallback?: boolean;
|
|
54
|
+
retries?: number;
|
|
55
|
+
}): void;
|
|
39
56
|
/**
|
|
40
57
|
* 프로젝트별 비용 조회
|
|
41
58
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CostAccumulator.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/CostAccumulator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"CostAccumulator.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/CostAccumulator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,IAAI,GAAG,OAAO,GAAG,UAAU,CAAC;CACpC;AA+BD,qBAAa,eAAe;IAC1B;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;IAuCR;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,WAAW;IAYd;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAWvD;;OAEG;IACH,MAAM,CAAC,WAAW,CAChB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC7B,WAAW;IA8Bd,OAAO,CAAC,MAAM,CAAC,WAAW;IAqB1B,OAAO,CAAC,MAAM,CAAC,SAAS;CAuBzB"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CostAccumulator — JSONL 비용 로그
|
|
3
|
-
*
|
|
2
|
+
* CostAccumulator — JSONL 비용 로그 조회/기록 및 프로젝트별 예산 관리
|
|
3
|
+
* ~/.vibe/llm-costs.jsonl 을 읽고(조회/예산) 쓴다(logCost).
|
|
4
|
+
* hooks/scripts/utils.js 의 logLlmCost() 와 동일 포맷·경로를 공유한다 — hook CLI 호출과
|
|
5
|
+
* TS 직접 provider 호출이 같은 원장에 집계되어 cost telemetry 과소집계를 막는다 (B-8).
|
|
4
6
|
*/
|
|
5
7
|
import fs from 'fs';
|
|
6
8
|
import path from 'path';
|
|
@@ -15,10 +17,66 @@ const DEFAULT_BUDGET = {
|
|
|
15
17
|
alertThresholdPercent: 80,
|
|
16
18
|
blockingThresholdPercent: 95,
|
|
17
19
|
};
|
|
20
|
+
const MAX_COST_SIZE_BYTES = 5 * 1024 * 1024; // 5MB rotation (JS logLlmCost 와 동일)
|
|
21
|
+
// 1K 토큰당 USD (추정치) — hooks/scripts/utils.js 의 COST_PER_1K_TOKENS 와 동기 유지
|
|
22
|
+
const COST_PER_1K_TOKENS = {
|
|
23
|
+
'gpt-5.5': { input: 0.005, output: 0.030 },
|
|
24
|
+
'gpt-5.5-pro': { input: 0.030, output: 0.180 },
|
|
25
|
+
'gpt-5.3-codex': { input: 0.003, output: 0.010 },
|
|
26
|
+
'gpt-5.3-codex-spark': { input: 0.001, output: 0.005 },
|
|
27
|
+
'gemini-3.1-pro-preview': { input: 0.00125, output: 0.005 },
|
|
28
|
+
};
|
|
29
|
+
const DEFAULT_RATE = { input: 0.003, output: 0.010 };
|
|
18
30
|
// ============================================================================
|
|
19
31
|
// CostAccumulator
|
|
20
32
|
// ============================================================================
|
|
21
33
|
export class CostAccumulator {
|
|
34
|
+
/**
|
|
35
|
+
* TS 직접 provider 호출의 비용/지표를 JS logLlmCost 와 동일 포맷으로 기록한다 (B-8).
|
|
36
|
+
* 실패가 호출을 방해하지 않도록 모든 오류를 삼킨다.
|
|
37
|
+
*/
|
|
38
|
+
static logCost(opts) {
|
|
39
|
+
try {
|
|
40
|
+
// 5MB 초과 시 rotation (JS 와 동일)
|
|
41
|
+
if (fs.existsSync(COST_LOG_PATH)) {
|
|
42
|
+
const stat = fs.statSync(COST_LOG_PATH);
|
|
43
|
+
if (stat.size > MAX_COST_SIZE_BYTES) {
|
|
44
|
+
try {
|
|
45
|
+
fs.unlinkSync(COST_LOG_PREV);
|
|
46
|
+
}
|
|
47
|
+
catch { /* ignore */ }
|
|
48
|
+
fs.renameSync(COST_LOG_PATH, COST_LOG_PREV);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
fs.mkdirSync(path.dirname(COST_LOG_PATH), { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
// 문자 수 → 토큰 추정 (평균 3자/토큰), JS 와 동일
|
|
55
|
+
const inputTokens = Math.ceil(opts.inputLen / 3);
|
|
56
|
+
const outputTokens = Math.ceil(opts.outputLen / 3);
|
|
57
|
+
const rates = COST_PER_1K_TOKENS[opts.model] || DEFAULT_RATE;
|
|
58
|
+
const cost = opts.cached
|
|
59
|
+
? 0
|
|
60
|
+
: (inputTokens / 1000) * rates.input + (outputTokens / 1000) * rates.output;
|
|
61
|
+
const entry = {
|
|
62
|
+
ts: new Date().toISOString(),
|
|
63
|
+
provider: opts.provider,
|
|
64
|
+
model: opts.model,
|
|
65
|
+
inputTokens,
|
|
66
|
+
outputTokens,
|
|
67
|
+
cost: Math.round(cost * 1_000_000) / 1_000_000,
|
|
68
|
+
durationMs: opts.durationMs,
|
|
69
|
+
cached: !!opts.cached,
|
|
70
|
+
project: opts.project ?? process.cwd(),
|
|
71
|
+
};
|
|
72
|
+
if (opts.usedFallback !== undefined)
|
|
73
|
+
entry.usedFallback = opts.usedFallback;
|
|
74
|
+
if (opts.retries !== undefined)
|
|
75
|
+
entry.retries = opts.retries;
|
|
76
|
+
fs.appendFileSync(COST_LOG_PATH, JSON.stringify(entry) + '\n');
|
|
77
|
+
}
|
|
78
|
+
catch { /* telemetry 실패가 호출을 방해해선 안 됨 */ }
|
|
79
|
+
}
|
|
22
80
|
/**
|
|
23
81
|
* 프로젝트별 비용 조회
|
|
24
82
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CostAccumulator.js","sourceRoot":"","sources":["../../../src/infra/lib/CostAccumulator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"CostAccumulator.js","sourceRoot":"","sources":["../../../src/infra/lib/CostAccumulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EACV,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,WAAW,EAEZ,MAAM,YAAY,CAAC;AAMpB,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAkB3E;AAED,eAAO,MAAM,kBAAkB,sCAAyB,CAAC;AAEzD,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAoGhD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAQtE;AAED;;GAEG;AACH,wBAAuB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC,CASnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,oBAAoB,EAAE,CAE3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAsB,GAAG,CACvB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAM,GAC1C,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9D"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* API Key → Google AI Studio
|
|
5
5
|
*/
|
|
6
6
|
import { sleep } from '../utils.js';
|
|
7
|
+
import { createTimeoutSignal } from '../llm/timeout.js';
|
|
7
8
|
import { getAuthInfo } from './auth.js';
|
|
8
9
|
import { getModelOverride } from '../config/GlobalConfigManager.js';
|
|
9
10
|
import { MAX_RETRIES, RETRY_BASE_DELAY_MS, } from './constants.js';
|
|
@@ -57,12 +58,14 @@ async function chatWithApiKey(apiKey, options) {
|
|
|
57
58
|
requestBody.systemInstruction = { parts: [{ text: systemPrompt }] };
|
|
58
59
|
}
|
|
59
60
|
const retryCount = options._retryCount || 0;
|
|
61
|
+
const { signal, cleanup } = createTimeoutSignal(options.timeoutMs, options.signal);
|
|
60
62
|
try {
|
|
61
63
|
const url = `https://generativelanguage.googleapis.com/v1beta/models/${actualModel}:generateContent?key=${apiKey}`;
|
|
62
64
|
const response = await fetch(url, {
|
|
63
65
|
method: 'POST',
|
|
64
66
|
headers: { 'Content-Type': 'application/json' },
|
|
65
67
|
body: JSON.stringify(requestBody),
|
|
68
|
+
signal,
|
|
66
69
|
});
|
|
67
70
|
if (!response.ok) {
|
|
68
71
|
const errorText = await response.text();
|
|
@@ -98,6 +101,9 @@ async function chatWithApiKey(apiKey, options) {
|
|
|
98
101
|
}
|
|
99
102
|
throw error;
|
|
100
103
|
}
|
|
104
|
+
finally {
|
|
105
|
+
cleanup();
|
|
106
|
+
}
|
|
101
107
|
}
|
|
102
108
|
// =============================================
|
|
103
109
|
// Public API
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAuB,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EACL,WAAW,EACX,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AASxB,gDAAgD;AAChD,WAAW;AACX,gDAAgD;AAEhD,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,gBAAgB,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,wBAAwB,CAAC;IAC3G,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,+BAA+B,CAAC;IAEtF,OAAO;QACL,iBAAiB,EAAE;YACjB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,6BAA6B;YAC1C,SAAS,EAAE,IAAI;SAChB;QACD,kBAAkB,EAAE;YAClB,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,kCAAkC;YAC/C,SAAS,EAAE,IAAI;SAChB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,EAAE,CAAC;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEhD,gDAAgD;AAChD,gCAAgC;AAChC,gDAAgD;AAEhD,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,OAAoB;IAEpB,MAAM,EACJ,KAAK,GAAG,aAAa,EACrB,QAAQ,GAAG,EAAE,EACb,SAAS,GAAG,IAAI,EAChB,WAAW,GAAG,GAAG,EACjB,YAAY,GAAG,EAAE,EACjB,QAAQ,GAAG,KAAK,GACjB,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IAEjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACzE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;KAC/B,CAAC,CAAC,CAAC;IAEJ,MAAM,gBAAgB,GAA4B;QAChD,eAAe,EAAE,SAAS;QAC1B,WAAW;KACZ,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,gBAAgB,CAAC,gBAAgB,GAAG,kBAAkB,CAAC;IACzD,CAAC;IAED,MAAM,WAAW,GAA4B;QAC3C,QAAQ;QACR,gBAAgB;KACjB,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,WAAW,CAAC,iBAAiB,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestration.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/orchestration.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"orchestration.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/orchestration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5E;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMjG;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5F;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CACnD,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOnF"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* - 검색 없이 빠르고 결정론적인 응답
|
|
4
4
|
*/
|
|
5
5
|
import { chat } from './chat.js';
|
|
6
|
+
import { CostAccumulator } from '../CostAccumulator.js';
|
|
6
7
|
/**
|
|
7
8
|
* Core Antigravity 오케스트레이션 (검색 없음, JSON 모드)
|
|
8
9
|
* - 검색 제외로 빠른 응답
|
|
@@ -10,7 +11,8 @@ import { chat } from './chat.js';
|
|
|
10
11
|
* - JSON 출력 강제 가능
|
|
11
12
|
*/
|
|
12
13
|
export async function coreAntigravityOrchestrate(prompt, systemPrompt, options = {}) {
|
|
13
|
-
const { maxTokens = 4096, jsonMode = true } = options;
|
|
14
|
+
const { maxTokens = 4096, jsonMode = true, signal, timeoutMs } = options;
|
|
15
|
+
const start = Date.now();
|
|
14
16
|
const result = await chat({
|
|
15
17
|
model: 'antigravity-pro',
|
|
16
18
|
messages: [{ role: 'user', content: prompt }],
|
|
@@ -21,6 +23,16 @@ export async function coreAntigravityOrchestrate(prompt, systemPrompt, options =
|
|
|
21
23
|
systemPrompt: jsonMode
|
|
22
24
|
? `${systemPrompt}\n\nRespond with valid JSON only.`
|
|
23
25
|
: systemPrompt,
|
|
26
|
+
signal,
|
|
27
|
+
timeoutMs,
|
|
28
|
+
});
|
|
29
|
+
// TS 직접 호출 비용 집계 (B-8) — hook CLI 와 동일 원장에 기록
|
|
30
|
+
CostAccumulator.logCost({
|
|
31
|
+
provider: 'antigravity',
|
|
32
|
+
model: result.model || 'antigravity-pro',
|
|
33
|
+
inputLen: prompt.length + systemPrompt.length,
|
|
34
|
+
outputLen: result.content.length,
|
|
35
|
+
durationMs: Date.now() - start,
|
|
24
36
|
});
|
|
25
37
|
return result.content;
|
|
26
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestration.js","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/orchestration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAiB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestration.js","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/orchestration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAiB,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAc,EACd,YAAoB,EACpB,UAAkC,EAAE;IAEpC,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;QACxB,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7C,SAAS;QACT,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,KAAK;QAChB,QAAQ;QACR,YAAY,EAAE,QAAQ;YACpB,CAAC,CAAC,GAAG,YAAY,mCAAmC;YACpD,CAAC,CAAC,YAAY;QAChB,MAAM;QACN,SAAS;KACV,CAAC,CAAC;IACH,8CAA8C;IAC9C,eAAe,CAAC,OAAO,CAAC;QACtB,QAAQ,EAAE,aAAa;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,iBAAiB;QACxC,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM;QAC7C,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;QAChC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC/B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY;IACzD,OAAO,0BAA0B,CAAC,IAAI,EAAE;0EACgC,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,IAAY,EAAE,OAAe;IAC9E,OAAO,0BAA0B,CAC/B,SAAS,IAAI,iBAAiB,OAAO,EAAE,EACvC;yIACqI,CACtI,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,QAAgB;IACzE,OAAO,0BAA0B,CAC/B,kBAAkB,IAAI,yBAAyB,QAAQ,EAAE,EACzD;mFAC+E,CAChF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,YAAoB,EACpB,gBAA0B,EAC1B,IAAY;IAEZ,OAAO,0BAA0B,CAC/B,mBAAmB,YAAY,2BAA2B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,EACxG;8EAC0E,CAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,WAAmB;IAChE,OAAO,0BAA0B,CAC/B,WAAW,EACX;iHAC6G,EAC7G,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;AACJ,CAAC"}
|
|
@@ -34,6 +34,10 @@ export interface ChatOptions {
|
|
|
34
34
|
jsonMode?: boolean;
|
|
35
35
|
/** 내부 재시도 카운터 */
|
|
36
36
|
_retryCount?: number;
|
|
37
|
+
/** 외부 취소 signal (SmartRouter 등). timeout 과 결합된다. */
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
/** fetch hard timeout (ms). 미지정 시 DEFAULT_LLM_TIMEOUT_MS. */
|
|
40
|
+
timeoutMs?: number;
|
|
37
41
|
}
|
|
38
42
|
export interface ChatResponse {
|
|
39
43
|
content: string;
|
|
@@ -111,5 +115,9 @@ export interface CompleteCodeResponse {
|
|
|
111
115
|
export interface VibeAntigravityOptions {
|
|
112
116
|
maxTokens?: number;
|
|
113
117
|
jsonMode?: boolean;
|
|
118
|
+
/** 외부 취소 signal (SmartRouter 등). chat 으로 관통된다. */
|
|
119
|
+
signal?: AbortSignal;
|
|
120
|
+
/** fetch hard timeout (ms). */
|
|
121
|
+
timeoutMs?: number;
|
|
114
122
|
}
|
|
115
123
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAE7C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAMD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/antigravity/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* VectorStore — SQLite 기반 벡터 저장소
|
|
3
3
|
*
|
|
4
4
|
* 메모리/세션 엔티티의 임베딩 벡터를 BLOB으로 저장.
|
|
5
|
-
* 검색:
|
|
6
|
-
* (메모리 수 천~만 건 수준이므로
|
|
5
|
+
* 검색: 행 단위 iterate → 코사인 유사도 → 스트리밍 top-k 선택.
|
|
6
|
+
* (메모리 수 천~만 건 수준이므로 인덱스 없는 선형 스캔으로 충분하나,
|
|
7
|
+
* 전량 적재+전체 정렬은 피해 메모리 O(limit)·정렬 비용 제거)
|
|
7
8
|
*/
|
|
8
9
|
import Database from 'better-sqlite3';
|
|
9
10
|
import type { VectorSearchResult, SessionVectorSearchResult } from './types.js';
|
|
@@ -27,6 +28,12 @@ export declare class VectorStore {
|
|
|
27
28
|
* 세션 엔티티 벡터 삭제
|
|
28
29
|
*/
|
|
29
30
|
deleteSessionVector(entityType: string, entityId: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* 스트리밍 top-k 선택 — 전 행을 배열로 적재해 전체 정렬(O(V log V) + O(V) 메모리)
|
|
33
|
+
* 하는 대신, iterate()로 한 행씩 스코어링하며 크기 limit의 정렬 배열만 유지한다.
|
|
34
|
+
* limit은 통상 ≤20이므로 선형 삽입으로 충분 (O(V·limit), 메모리 O(limit)).
|
|
35
|
+
*/
|
|
36
|
+
private static topKBySimilarity;
|
|
30
37
|
/**
|
|
31
38
|
* 메모리 벡터 코사인 유사도 검색
|
|
32
39
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorStore.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/embedding/VectorStore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"VectorStore.d.ts","sourceRoot":"","sources":["../../../../src/infra/lib/embedding/VectorStore.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAMtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEhF,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAKjC,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACI,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAU/D;;OAEG;IACI,iBAAiB,CACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI;IAUP;;OAEG;IACI,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI5C;;OAEG;IACI,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMtE;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqB/B;;OAEG;IACI,mBAAmB,CACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,GAAE,MAAW,GACjB,kBAAkB,EAAE;IAgBvB;;OAEG;IACI,oBAAoB,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,GAAE,MAAW,GACjB,yBAAyB,EAAE;IAiB9B;;OAEG;IACI,oBAAoB,IAAI,MAAM;IAOrC;;OAEG;IACI,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;CAY1D"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* VectorStore — SQLite 기반 벡터 저장소
|
|
3
3
|
*
|
|
4
4
|
* 메모리/세션 엔티티의 임베딩 벡터를 BLOB으로 저장.
|
|
5
|
-
* 검색:
|
|
6
|
-
* (메모리 수 천~만 건 수준이므로
|
|
5
|
+
* 검색: 행 단위 iterate → 코사인 유사도 → 스트리밍 top-k 선택.
|
|
6
|
+
* (메모리 수 천~만 건 수준이므로 인덱스 없는 선형 스캔으로 충분하나,
|
|
7
|
+
* 전량 적재+전체 정렬은 피해 메모리 O(limit)·정렬 비용 제거)
|
|
7
8
|
*/
|
|
8
9
|
import { cosineSimilarity, serializeVector, deserializeVector, } from './cosine.js';
|
|
9
10
|
export class VectorStore {
|
|
@@ -65,34 +66,56 @@ export class VectorStore {
|
|
|
65
66
|
deleteSessionVector(entityType, entityId) {
|
|
66
67
|
this.db.prepare('DELETE FROM session_vectors WHERE entityType = ? AND entityId = ?').run(entityType, entityId);
|
|
67
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* 스트리밍 top-k 선택 — 전 행을 배열로 적재해 전체 정렬(O(V log V) + O(V) 메모리)
|
|
71
|
+
* 하는 대신, iterate()로 한 행씩 스코어링하며 크기 limit의 정렬 배열만 유지한다.
|
|
72
|
+
* limit은 통상 ≤20이므로 선형 삽입으로 충분 (O(V·limit), 메모리 O(limit)).
|
|
73
|
+
*/
|
|
74
|
+
static topKBySimilarity(rows, limit, score) {
|
|
75
|
+
const best = [];
|
|
76
|
+
for (const row of rows) {
|
|
77
|
+
const item = score(row);
|
|
78
|
+
if (best.length >= limit && item.similarity <= best[best.length - 1].similarity) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
let insertAt = best.length;
|
|
82
|
+
while (insertAt > 0 && best[insertAt - 1].similarity < item.similarity) {
|
|
83
|
+
insertAt--;
|
|
84
|
+
}
|
|
85
|
+
best.splice(insertAt, 0, item);
|
|
86
|
+
if (best.length > limit)
|
|
87
|
+
best.pop();
|
|
88
|
+
}
|
|
89
|
+
return best;
|
|
90
|
+
}
|
|
68
91
|
/**
|
|
69
92
|
* 메모리 벡터 코사인 유사도 검색
|
|
70
93
|
*/
|
|
71
94
|
searchMemoryVectors(queryVec, limit = 20) {
|
|
72
|
-
const rows = this.db.prepare('SELECT key, embedding FROM memory_vectors').
|
|
95
|
+
const rows = this.db.prepare('SELECT key, embedding FROM memory_vectors').iterate();
|
|
73
96
|
const queryFloat = new Float32Array(queryVec);
|
|
74
|
-
return rows
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
97
|
+
return VectorStore.topKBySimilarity(rows, limit, (raw) => {
|
|
98
|
+
const row = raw;
|
|
99
|
+
return {
|
|
100
|
+
key: row.key,
|
|
101
|
+
similarity: cosineSimilarity(queryFloat, deserializeVector(row.embedding)),
|
|
102
|
+
};
|
|
103
|
+
});
|
|
81
104
|
}
|
|
82
105
|
/**
|
|
83
106
|
* 세션 엔티티 벡터 코사인 유사도 검색
|
|
84
107
|
*/
|
|
85
108
|
searchSessionVectors(entityType, queryVec, limit = 20) {
|
|
86
|
-
const rows = this.db.prepare('SELECT entityId, embedding FROM session_vectors WHERE entityType = ?').
|
|
109
|
+
const rows = this.db.prepare('SELECT entityId, embedding FROM session_vectors WHERE entityType = ?').iterate(entityType);
|
|
87
110
|
const queryFloat = new Float32Array(queryVec);
|
|
88
|
-
return rows
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
111
|
+
return VectorStore.topKBySimilarity(rows, limit, (raw) => {
|
|
112
|
+
const row = raw;
|
|
113
|
+
return {
|
|
114
|
+
entityType,
|
|
115
|
+
entityId: row.entityId,
|
|
116
|
+
similarity: cosineSimilarity(queryFloat, deserializeVector(row.embedding)),
|
|
117
|
+
};
|
|
118
|
+
});
|
|
96
119
|
}
|
|
97
120
|
/**
|
|
98
121
|
* 저장된 메모리 벡터 수
|