@kenkaiiii/ggcoder 5.74.3 → 5.75.0
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/README.md +1 -1
- package/assets/skills/bulletproof/SKILL.md +1 -1
- package/assets/skills/clarify/SKILL.md +1 -1
- package/assets/skills/code-review/SKILL.md +1 -1
- package/assets/skills/compliance-guard/SKILL.md +1 -1
- package/assets/skills/durable/SKILL.md +1 -1
- package/assets/skills/evidence-led-ui/SKILL.md +1 -1
- package/assets/skills/lean/SKILL.md +1 -1
- package/assets/skills/refactoring/SKILL.md +1 -1
- package/assets/skills/root-cause/SKILL.md +1 -1
- package/assets/skills/shared-language/SKILL.md +1 -1
- package/assets/skills/tdd/SKILL.md +1 -1
- package/dist/app-sidecar/app-settings.d.ts +65 -0
- package/dist/app-sidecar/app-settings.js +147 -0
- package/dist/app-sidecar/app-settings.js.map +1 -0
- package/dist/app-sidecar/attachments.d.ts +11 -0
- package/dist/app-sidecar/attachments.js +47 -0
- package/dist/app-sidecar/attachments.js.map +1 -0
- package/dist/app-sidecar/auth-routes.d.ts +3 -0
- package/dist/app-sidecar/auth-routes.js +290 -0
- package/dist/app-sidecar/auth-routes.js.map +1 -0
- package/dist/app-sidecar/autopilot-runner.d.ts +61 -0
- package/dist/app-sidecar/autopilot-runner.js +367 -0
- package/dist/app-sidecar/autopilot-runner.js.map +1 -0
- package/dist/app-sidecar/file-search.d.ts +15 -0
- package/dist/app-sidecar/file-search.js +103 -0
- package/dist/app-sidecar/file-search.js.map +1 -0
- package/dist/app-sidecar/hf-pull-manager.d.ts +20 -0
- package/dist/app-sidecar/hf-pull-manager.js +224 -0
- package/dist/app-sidecar/hf-pull-manager.js.map +1 -0
- package/dist/app-sidecar/history-routes.d.ts +3 -0
- package/dist/app-sidecar/history-routes.js +375 -0
- package/dist/app-sidecar/history-routes.js.map +1 -0
- package/dist/app-sidecar/history.d.ts +67 -0
- package/dist/app-sidecar/history.js +23 -0
- package/dist/app-sidecar/history.js.map +1 -0
- package/dist/app-sidecar/http.d.ts +5 -0
- package/dist/app-sidecar/http.js +27 -0
- package/dist/app-sidecar/http.js.map +1 -0
- package/dist/app-sidecar/integration-routes.d.ts +3 -0
- package/dist/app-sidecar/integration-routes.js +286 -0
- package/dist/app-sidecar/integration-routes.js.map +1 -0
- package/dist/app-sidecar/json-mode.d.ts +10 -0
- package/dist/app-sidecar/json-mode.js +73 -0
- package/dist/app-sidecar/json-mode.js.map +1 -0
- package/dist/app-sidecar/keep-awake.d.ts +4 -0
- package/dist/app-sidecar/keep-awake.js +5 -0
- package/dist/app-sidecar/keep-awake.js.map +1 -0
- package/dist/app-sidecar/ken-context.d.ts +20 -0
- package/dist/app-sidecar/ken-context.js +55 -0
- package/dist/app-sidecar/ken-context.js.map +1 -0
- package/dist/app-sidecar/mcp-routes.d.ts +3 -0
- package/dist/app-sidecar/mcp-routes.js +185 -0
- package/dist/app-sidecar/mcp-routes.js.map +1 -0
- package/dist/app-sidecar/mcp-rows.d.ts +31 -0
- package/dist/app-sidecar/mcp-rows.js +77 -0
- package/dist/app-sidecar/mcp-rows.js.map +1 -0
- package/dist/app-sidecar/progress-manager.d.ts +10 -0
- package/dist/app-sidecar/progress-manager.js +116 -0
- package/dist/app-sidecar/progress-manager.js.map +1 -0
- package/dist/app-sidecar/prompt-routes.d.ts +3 -0
- package/dist/app-sidecar/prompt-routes.js +354 -0
- package/dist/app-sidecar/prompt-routes.js.map +1 -0
- package/dist/app-sidecar/route-context.d.ts +145 -0
- package/dist/app-sidecar/route-context.js +2 -0
- package/dist/app-sidecar/route-context.js.map +1 -0
- package/dist/app-sidecar/run-control-routes.d.ts +3 -0
- package/dist/app-sidecar/run-control-routes.js +430 -0
- package/dist/app-sidecar/run-control-routes.js.map +1 -0
- package/dist/app-sidecar/session-routes.d.ts +3 -0
- package/dist/app-sidecar/session-routes.js +115 -0
- package/dist/app-sidecar/session-routes.js.map +1 -0
- package/dist/app-sidecar/session-types.d.ts +39 -0
- package/dist/app-sidecar/session-types.js +5 -0
- package/dist/app-sidecar/session-types.js.map +1 -0
- package/dist/app-sidecar/task-routes.d.ts +3 -0
- package/dist/app-sidecar/task-routes.js +149 -0
- package/dist/app-sidecar/task-routes.js.map +1 -0
- package/dist/app-sidecar/usage.d.ts +19 -0
- package/dist/app-sidecar/usage.js +153 -0
- package/dist/app-sidecar/usage.js.map +1 -0
- package/dist/app-sidecar/workspace-routes.d.ts +3 -0
- package/dist/app-sidecar/workspace-routes.js +244 -0
- package/dist/app-sidecar/workspace-routes.js.map +1 -0
- package/dist/app-sidecar.js +440 -3720
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/core/acceptance-checks.js +3 -9
- package/dist/core/acceptance-checks.js.map +1 -1
- package/dist/core/agent-session/helpers.d.ts +26 -0
- package/dist/core/agent-session/helpers.js +47 -0
- package/dist/core/agent-session/helpers.js.map +1 -0
- package/dist/core/agent-session/mcp-tools.d.ts +68 -0
- package/dist/core/agent-session/mcp-tools.js +195 -0
- package/dist/core/agent-session/mcp-tools.js.map +1 -0
- package/dist/core/agent-session/run-loop-monitor.d.ts +63 -0
- package/dist/core/agent-session/run-loop-monitor.js +164 -0
- package/dist/core/agent-session/run-loop-monitor.js.map +1 -0
- package/dist/core/agent-session/transcript-markers.d.ts +57 -0
- package/dist/core/agent-session/transcript-markers.js +166 -0
- package/dist/core/agent-session/transcript-markers.js.map +1 -0
- package/dist/core/agent-session/verification-tracker.d.ts +46 -0
- package/dist/core/agent-session/verification-tracker.js +246 -0
- package/dist/core/agent-session/verification-tracker.js.map +1 -0
- package/dist/core/agent-session.d.ts +21 -87
- package/dist/core/agent-session.js +141 -712
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-providers.js +3 -3
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/bundled-agents.js +6 -6
- package/dist/core/bundled-agents.js.map +1 -1
- package/dist/core/checklist-git.d.ts +19 -0
- package/dist/core/checklist-git.js +54 -0
- package/dist/core/checklist-git.js.map +1 -0
- package/dist/core/checklist-items.d.ts +10 -1
- package/dist/core/checklist-items.js +22 -0
- package/dist/core/checklist-items.js.map +1 -1
- package/dist/core/checklist-prompt.d.ts +5 -1
- package/dist/core/checklist-prompt.js +16 -5
- package/dist/core/checklist-prompt.js.map +1 -1
- package/dist/core/checklist-snapshot.d.ts +5 -1
- package/dist/core/checklist-snapshot.js +19 -2
- package/dist/core/checklist-snapshot.js.map +1 -1
- package/dist/core/context-limits.js +1 -1
- package/dist/core/context-limits.js.map +1 -1
- package/dist/core/skills.js +6 -9
- package/dist/core/skills.js.map +1 -1
- package/dist/core/style-packs/index.js +2 -11
- package/dist/core/style-packs/index.js.map +1 -1
- package/dist/core/style-packs/packs.d.ts +3 -12
- package/dist/core/style-packs/packs.js +132 -173
- package/dist/core/style-packs/packs.js.map +1 -1
- package/dist/system-prompt.js +55 -78
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/ask-user.js +13 -74
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/bash.js +13 -78
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/checklist.d.ts +2 -10
- package/dist/tools/checklist.js +7 -39
- package/dist/tools/checklist.js.map +1 -1
- package/dist/tools/code-nav.js +7 -29
- package/dist/tools/code-nav.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -9
- package/dist/tools/edit.js +66 -65
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/enter-plan.js +2 -7
- package/dist/tools/enter-plan.js.map +1 -1
- package/dist/tools/exit-plan.js +2 -3
- package/dist/tools/exit-plan.js.map +1 -1
- package/dist/tools/find.js +3 -4
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.js +6 -18
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/ls.js +3 -3
- package/dist/tools/ls.js.map +1 -1
- package/dist/tools/prompt-hints.js +34 -47
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read.js +8 -20
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/search-code.js +4 -12
- package/dist/tools/search-code.js.map +1 -1
- package/dist/tools/skill.js +13 -7
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-control.js +7 -22
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/subagent.js +4 -7
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/task-output.js +4 -15
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/task-send.js +5 -17
- package/dist/tools/task-send.js.map +1 -1
- package/dist/tools/task-stop.js +2 -2
- package/dist/tools/task-stop.js.map +1 -1
- package/dist/tools/tool-search.js +2 -7
- package/dist/tools/tool-search.js.map +1 -1
- package/dist/tools/tool-tiers.d.ts +17 -4
- package/dist/tools/tool-tiers.js +38 -15
- package/dist/tools/tool-tiers.js.map +1 -1
- package/dist/tools/web-fetch.js +7 -33
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/write.js +3 -4
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/Footer.js +1 -2
- package/dist/ui/components/Footer.js.map +1 -1
- package/package.json +7 -4
- package/dist/core/api-benchmark.d.ts +0 -63
- package/dist/core/api-benchmark.js +0 -381
- package/dist/core/api-benchmark.js.map +0 -1
- package/dist/core/bash-spawn-benchmark.d.ts +0 -1
- package/dist/core/bash-spawn-benchmark.js +0 -139
- package/dist/core/bash-spawn-benchmark.js.map +0 -1
- package/dist/core/cache-warm-benchmark.d.ts +0 -21
- package/dist/core/cache-warm-benchmark.js +0 -170
- package/dist/core/cache-warm-benchmark.js.map +0 -1
- package/dist/core/fast-apply-benchmark.d.ts +0 -25
- package/dist/core/fast-apply-benchmark.js +0 -284
- package/dist/core/fast-apply-benchmark.js.map +0 -1
- package/dist/core/hashline-edit-benchmark.d.ts +0 -88
- package/dist/core/hashline-edit-benchmark.js +0 -518
- package/dist/core/hashline-edit-benchmark.js.map +0 -1
- package/dist/core/semantic-search-benchmark.d.ts +0 -36
- package/dist/core/semantic-search-benchmark.js +0 -211
- package/dist/core/semantic-search-benchmark.js.map +0 -1
- package/dist/core/speed-benchmark.d.ts +0 -132
- package/dist/core/speed-benchmark.js +0 -410
- package/dist/core/speed-benchmark.js.map +0 -1
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Semantic AST-chunk retrieval vs whole-file reads — real-API measurement of
|
|
3
|
-
* whether Feature #3 is worth building.
|
|
4
|
-
*
|
|
5
|
-
* The claim (cocoindex-code / oh-my-pi): replacing "grep then read whole files"
|
|
6
|
-
* with "retrieve only the relevant AST chunks" cuts ~70% of the tokens an agent
|
|
7
|
-
* spends locating code, with no loss of answer quality. We test that directly on
|
|
8
|
-
* OUR OWN repo against a live model.
|
|
9
|
-
*
|
|
10
|
-
* For a set of natural-language questions about real files in this repo, we build
|
|
11
|
-
* three context strategies and ask the model the same question with each:
|
|
12
|
-
*
|
|
13
|
-
* BASELINE (whole-file): deliver the FULL text of the top files a lexical
|
|
14
|
-
* grep would surface — this is what the agent reads today (read + grep).
|
|
15
|
-
*
|
|
16
|
-
* SEMANTIC (AST chunks): parse every file into top-level declarations
|
|
17
|
-
* (functions / classes / interfaces / consts), rank chunks with a real BM25
|
|
18
|
-
* retriever, and deliver only the top-k chunks. No embedding model needed; a
|
|
19
|
-
* learned embedding retriever would land between BM25 and ORACLE.
|
|
20
|
-
*
|
|
21
|
-
* ORACLE (upper bound): deliver only the hand-labelled answer chunk(s) — the
|
|
22
|
-
* best case any retriever could achieve.
|
|
23
|
-
*
|
|
24
|
-
* We measure, per question and strategy: INPUT tokens delivered (the headline
|
|
25
|
-
* cost) and whether the model's answer was correct (deterministic keyword grade).
|
|
26
|
-
* The verdict: does SEMANTIC reach BASELINE-level correctness at a fraction of
|
|
27
|
-
* the input tokens?
|
|
28
|
-
*
|
|
29
|
-
* Usage:
|
|
30
|
-
* npx tsx src/core/semantic-search-benchmark.ts
|
|
31
|
-
*
|
|
32
|
-
* Env overrides:
|
|
33
|
-
* GG_SS_PROVIDER / GG_SS_MODEL (default openai / gpt-6.1-sol)
|
|
34
|
-
* GG_SS_TOPK (chunks/files delivered, default 3)
|
|
35
|
-
*/
|
|
36
|
-
import fs from "node:fs";
|
|
37
|
-
import path from "node:path";
|
|
38
|
-
import { fileURLToPath } from "node:url";
|
|
39
|
-
import { stream } from "@kenkaiiii/gg-ai";
|
|
40
|
-
import { AuthStorage } from "./auth-storage.js";
|
|
41
|
-
import { chunkFile, bm25Rank, rankFiles } from "./code-retrieval.js";
|
|
42
|
-
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
43
|
-
const SRC = path.resolve(HERE, ".."); // packages/ggcoder/src
|
|
44
|
-
const QUESTIONS = [
|
|
45
|
-
{
|
|
46
|
-
q: "Which method resolves provider credentials and auto-refreshes expired OAuth tokens, and what happens if it is not logged in?",
|
|
47
|
-
files: ["core/auth-storage.ts", "core/loop-breaker.ts", "tools/edit-diff.ts"],
|
|
48
|
-
oracle: { file: "core/auth-storage.ts", symbol: "resolveCredentials" },
|
|
49
|
-
mustInclude: ["resolvecredentials", "refresh"],
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
q: "What function performs fuzzy text matching for the edit tool, and how does it tolerate indentation drift?",
|
|
53
|
-
files: ["tools/edit-diff.ts", "core/auth-storage.ts", "core/checkpoint-store.ts"],
|
|
54
|
-
oracle: { file: "tools/edit-diff.ts", symbol: "fuzzyFindText" },
|
|
55
|
-
mustInclude: ["fuzzyfindtext", "indent"],
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
q: "What restore modes does the checkpoint / rewind system support?",
|
|
59
|
-
files: ["core/checkpoint-store.ts", "core/loop-breaker.ts", "tools/edit-diff.ts"],
|
|
60
|
-
oracle: { file: "core/checkpoint-store.ts", symbol: "RestoreMode" },
|
|
61
|
-
mustInclude: ["code", "conversation", "both"],
|
|
62
|
-
},
|
|
63
|
-
];
|
|
64
|
-
function sleep(ms) {
|
|
65
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
66
|
-
}
|
|
67
|
-
async function ask(provider, model, c, context, question) {
|
|
68
|
-
const messages = [
|
|
69
|
-
{
|
|
70
|
-
role: "system",
|
|
71
|
-
content: "You answer questions about a codebase using ONLY the provided context. " +
|
|
72
|
-
"Be specific: name the exact functions/types involved. If the context is insufficient, say so. " +
|
|
73
|
-
"Answer in 1-3 sentences.",
|
|
74
|
-
},
|
|
75
|
-
{ role: "user", content: `CONTEXT:\n${context}\n\nQUESTION: ${question}` },
|
|
76
|
-
];
|
|
77
|
-
let lastErr;
|
|
78
|
-
for (let attempt = 0; attempt < 4; attempt++) {
|
|
79
|
-
try {
|
|
80
|
-
let text = "";
|
|
81
|
-
const result = stream({
|
|
82
|
-
provider: provider,
|
|
83
|
-
model,
|
|
84
|
-
messages,
|
|
85
|
-
maxTokens: 512,
|
|
86
|
-
apiKey: c.apiKey,
|
|
87
|
-
baseUrl: c.baseUrl,
|
|
88
|
-
accountId: c.accountId,
|
|
89
|
-
});
|
|
90
|
-
for await (const event of result) {
|
|
91
|
-
if (event.type === "text_delta")
|
|
92
|
-
text += event.text;
|
|
93
|
-
}
|
|
94
|
-
const response = await result.response;
|
|
95
|
-
const content = response.message.content;
|
|
96
|
-
const finalText = typeof content === "string"
|
|
97
|
-
? content
|
|
98
|
-
: content
|
|
99
|
-
.filter((p) => p.type === "text")
|
|
100
|
-
.map((p) => p.text ?? "")
|
|
101
|
-
.join("");
|
|
102
|
-
return {
|
|
103
|
-
text: finalText || text,
|
|
104
|
-
inputTokens: response.usage.inputTokens,
|
|
105
|
-
outputTokens: response.usage.outputTokens,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
lastErr = err;
|
|
110
|
-
await sleep(2000 * (attempt + 1));
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
throw lastErr;
|
|
114
|
-
}
|
|
115
|
-
export function grade(answer, mustInclude) {
|
|
116
|
-
const a = answer.toLowerCase();
|
|
117
|
-
return mustInclude.every((t) => a.includes(t));
|
|
118
|
-
}
|
|
119
|
-
async function main() {
|
|
120
|
-
const provider = process.env.GG_SS_PROVIDER ?? "openai";
|
|
121
|
-
const model = process.env.GG_SS_MODEL ?? "gpt-6.1-sol";
|
|
122
|
-
const topK = Math.max(1, parseInt(process.env.GG_SS_TOPK ?? "3", 10));
|
|
123
|
-
const auth = new AuthStorage();
|
|
124
|
-
await auth.load();
|
|
125
|
-
const cr = await auth.resolveCredentials(provider);
|
|
126
|
-
const creds = { apiKey: cr.accessToken, baseUrl: cr.baseUrl, accountId: cr.accountId };
|
|
127
|
-
console.log(`\n🔎 Semantic-search benchmark — ${provider}/${model} (top-${topK})\n`);
|
|
128
|
-
const rows = [];
|
|
129
|
-
for (const q of QUESTIONS) {
|
|
130
|
-
// Load the real corpus files; skip the question if any are missing/moved.
|
|
131
|
-
const files = new Map();
|
|
132
|
-
let missing = false;
|
|
133
|
-
for (const rel of q.files) {
|
|
134
|
-
const abs = path.join(SRC, rel);
|
|
135
|
-
if (!fs.existsSync(abs)) {
|
|
136
|
-
console.log(` ⚠ skipping question — missing ${rel}`);
|
|
137
|
-
missing = true;
|
|
138
|
-
break;
|
|
139
|
-
}
|
|
140
|
-
files.set(rel, fs.readFileSync(abs, "utf-8"));
|
|
141
|
-
}
|
|
142
|
-
if (missing)
|
|
143
|
-
continue;
|
|
144
|
-
// BASELINE context: full text of the top-k files a grep would surface.
|
|
145
|
-
const baseFiles = rankFiles(q.q, files, topK);
|
|
146
|
-
const baseContext = baseFiles.map((f) => `// FILE: ${f}\n${files.get(f)}`).join("\n\n");
|
|
147
|
-
// SEMANTIC context: top-k AST chunks across all corpus files.
|
|
148
|
-
const allChunks = [...files].flatMap(([rel, src]) => chunkFile(rel, src));
|
|
149
|
-
const semChunks = bm25Rank(q.q, allChunks, topK);
|
|
150
|
-
const semContext = semChunks.map((c) => `// ${c.file} → ${c.symbol}\n${c.text}`).join("\n\n");
|
|
151
|
-
// ORACLE context: just the labelled answer chunk.
|
|
152
|
-
const oracleChunk = allChunks.find((c) => c.file === q.oracle.file && c.symbol === q.oracle.symbol);
|
|
153
|
-
const oracleContext = oracleChunk
|
|
154
|
-
? `// ${oracleChunk.file} → ${oracleChunk.symbol}\n${oracleChunk.text}`
|
|
155
|
-
: semContext;
|
|
156
|
-
process.stdout.write(`▶ ${q.q.slice(0, 64)}…\n`);
|
|
157
|
-
await sleep(1200);
|
|
158
|
-
const base = await ask(provider, model, creds, baseContext, q.q);
|
|
159
|
-
await sleep(1200);
|
|
160
|
-
const sem = await ask(provider, model, creds, semContext, q.q);
|
|
161
|
-
await sleep(1200);
|
|
162
|
-
const oracle = await ask(provider, model, creds, oracleContext, q.q);
|
|
163
|
-
const row = {
|
|
164
|
-
q: q.q.slice(0, 40),
|
|
165
|
-
baseInTok: base.inputTokens,
|
|
166
|
-
baseOk: grade(base.text, q.mustInclude),
|
|
167
|
-
semInTok: sem.inputTokens,
|
|
168
|
-
semOk: grade(sem.text, q.mustInclude),
|
|
169
|
-
oracleInTok: oracle.inputTokens,
|
|
170
|
-
oracleOk: grade(oracle.text, q.mustInclude),
|
|
171
|
-
};
|
|
172
|
-
rows.push(row);
|
|
173
|
-
process.stdout.write(` baseline ${row.baseInTok} in tok ${row.baseOk ? "OK" : "FAIL"} | ` +
|
|
174
|
-
`semantic ${row.semInTok} in tok ${row.semOk ? "OK" : "FAIL"} | ` +
|
|
175
|
-
`oracle ${row.oracleInTok} in tok ${row.oracleOk ? "OK" : "FAIL"}\n\n`);
|
|
176
|
-
}
|
|
177
|
-
if (rows.length === 0) {
|
|
178
|
-
console.log("No questions ran (corpus files not found).");
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
// ── Report ──
|
|
182
|
-
console.log("══════════════════════ RESULTS ══════════════════════\n");
|
|
183
|
-
console.log("Question | base in-tok | sem in-tok | oracle | ok b/s/o");
|
|
184
|
-
for (const r of rows) {
|
|
185
|
-
console.log(`${r.q.padEnd(40)} | ${String(r.baseInTok).padStart(11)} | ${String(r.semInTok).padStart(10)} | ` +
|
|
186
|
-
`${String(r.oracleInTok).padStart(6)} | ${r.baseOk ? "1" : "0"}/${r.semOk ? "1" : "0"}/${r.oracleOk ? "1" : "0"}`);
|
|
187
|
-
}
|
|
188
|
-
const sum = (f) => rows.reduce((s, r) => s + f(r), 0);
|
|
189
|
-
const baseIn = sum((r) => r.baseInTok);
|
|
190
|
-
const semIn = sum((r) => r.semInTok);
|
|
191
|
-
const oracleIn = sum((r) => r.oracleInTok);
|
|
192
|
-
console.log(`\nInput tokens to answer: baseline ${baseIn} | semantic ${semIn} ` +
|
|
193
|
-
`(${(((baseIn - semIn) / baseIn) * 100).toFixed(0)}% fewer) | oracle ${oracleIn} ` +
|
|
194
|
-
`(${(((baseIn - oracleIn) / baseIn) * 100).toFixed(0)}% fewer)`);
|
|
195
|
-
console.log(`Correctness: baseline ${rows.filter((r) => r.baseOk).length}/${rows.length} | ` +
|
|
196
|
-
`semantic ${rows.filter((r) => r.semOk).length}/${rows.length} | ` +
|
|
197
|
-
`oracle ${rows.filter((r) => r.oracleOk).length}/${rows.length}`);
|
|
198
|
-
console.log(`\nVerdict: worth building if SEMANTIC keeps correctness ≈ baseline while cutting input tokens. ` +
|
|
199
|
-
`cocoindex claims ~70% fewer; ORACLE shows the ceiling a better (embedding) retriever could reach.\n`);
|
|
200
|
-
}
|
|
201
|
-
// Run when executed directly (not when imported by tests).
|
|
202
|
-
const isDirectRun = process.argv[1]?.endsWith("semantic-search-benchmark.ts") ||
|
|
203
|
-
process.argv[1]?.endsWith("semantic-search-benchmark.js") ||
|
|
204
|
-
process.argv[1]?.endsWith("semantic-search-benchmark");
|
|
205
|
-
if (isDirectRun) {
|
|
206
|
-
main().catch((err) => {
|
|
207
|
-
console.error("Benchmark failed:", err);
|
|
208
|
-
process.exit(1);
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=semantic-search-benchmark.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-search-benchmark.js","sourceRoot":"","sources":["../../src/core/semantic-search-benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Speed benchmark harness — measures the latency impact of speedProfile
|
|
3
|
-
* optimizations (1-h cache TTL + pre-warming) against the current baseline
|
|
4
|
-
* (5-min cache TTL, no pre-warm).
|
|
5
|
-
*
|
|
6
|
-
* Uses a mock streaming provider that simulates realistic provider timing:
|
|
7
|
-
* - Cold prefill (cache miss): proportional to uncached input tokens
|
|
8
|
-
* - Warm prefill (cache hit): 10× faster (cache reads cost 0.1×)
|
|
9
|
-
* - Output streaming: at a configurable token rate
|
|
10
|
-
* - Cache TTL: configurable (5 min baseline vs 1 h optimized)
|
|
11
|
-
*
|
|
12
|
-
* No real API calls are made — the mock uses real `setTimeout` for prefill and
|
|
13
|
-
* output-token latency (so wall-clock measurements are meaningful) but a
|
|
14
|
-
* virtual clock for inter-turn delays (so multi-minute gaps are instant).
|
|
15
|
-
*
|
|
16
|
-
* Run via vitest: npx vitest run src/core/speed-benchmark.test.ts
|
|
17
|
-
* Or as a script: npx tsx src/core/speed-benchmark.ts
|
|
18
|
-
*/
|
|
19
|
-
import { StreamResult, type StreamOptions } from "@kenkaiiii/gg-ai";
|
|
20
|
-
export interface MockTimingConfig {
|
|
21
|
-
/** ms per uncached input token during prefill (cold start). */
|
|
22
|
-
coldPrefillMsPerToken: number;
|
|
23
|
-
/** ms per cached input token during prefill (cache hit). 10× faster. */
|
|
24
|
-
warmPrefillMsPerToken: number;
|
|
25
|
-
/** ms per output token (determines streaming rate). ~15ms = 66 tok/s. */
|
|
26
|
-
outputMsPerToken: number;
|
|
27
|
-
/** Cache TTL in ms. 5_000 = baseline (5 min), 3_600_000 = optimized (1 h). */
|
|
28
|
-
cacheTtlMs: number;
|
|
29
|
-
/** Fixed network overhead per request (TCP + TLS + auth). */
|
|
30
|
-
networkOverheadMs: number;
|
|
31
|
-
/** Default output tokens per turn if not specified by the workload. */
|
|
32
|
-
defaultOutputTokens: number;
|
|
33
|
-
}
|
|
34
|
-
export declare const REALISTIC_TIMING: MockTimingConfig;
|
|
35
|
-
/**
|
|
36
|
-
* A mock streaming provider that simulates LLM timing with cache semantics.
|
|
37
|
-
* Registered as provider "benchmark-mock" so the real agent loop code path
|
|
38
|
-
* is exercised end-to-end.
|
|
39
|
-
*/
|
|
40
|
-
export declare class MockBenchmarkProvider {
|
|
41
|
-
private cache;
|
|
42
|
-
private config;
|
|
43
|
-
/** Virtual clock — lets the benchmark simulate multi-minute gaps between
|
|
44
|
-
* turns without actually sleeping. The cache TTL check uses this, not
|
|
45
|
-
* Date.now(). Only prefill/output latency uses real setTimeout. */
|
|
46
|
-
private virtualNow;
|
|
47
|
-
readonly stats: {
|
|
48
|
-
cacheHits: number;
|
|
49
|
-
cacheMisses: number;
|
|
50
|
-
cacheWrites: number;
|
|
51
|
-
cacheEvictions: number;
|
|
52
|
-
totalPrefillMs: number;
|
|
53
|
-
totalOutputMs: number;
|
|
54
|
-
totalNetworkMs: number;
|
|
55
|
-
turns: number;
|
|
56
|
-
};
|
|
57
|
-
constructor(config?: Partial<MockTimingConfig>);
|
|
58
|
-
/** Update config (e.g., switch TTL for baseline vs optimized run). */
|
|
59
|
-
setConfig(config: Partial<MockTimingConfig>): void;
|
|
60
|
-
/** Advance the virtual clock (for cache TTL simulation without real sleeping). */
|
|
61
|
-
advanceClock(ms: number): void;
|
|
62
|
-
/** Clear all cache state and stats (between benchmark runs). */
|
|
63
|
-
reset(): void;
|
|
64
|
-
/** Number of entries currently in the mock cache. */
|
|
65
|
-
getCacheSize(): number;
|
|
66
|
-
/** Force a cache write (simulates pre-warming). */
|
|
67
|
-
prewarm(cacheKey: string, tokenCount: number): void;
|
|
68
|
-
stream(options: StreamOptions): StreamResult;
|
|
69
|
-
private runStream;
|
|
70
|
-
/** Compute a stable cache key from the system prompt + tool names. */
|
|
71
|
-
private computeCacheKey;
|
|
72
|
-
}
|
|
73
|
-
export interface WorkloadTurn {
|
|
74
|
-
/** User message content. */
|
|
75
|
-
prompt: string;
|
|
76
|
-
/** Delay before this turn (simulates user think time). Default: 0. */
|
|
77
|
-
delayMs?: number;
|
|
78
|
-
/** Override output tokens for this turn. */
|
|
79
|
-
outputTokens?: number;
|
|
80
|
-
}
|
|
81
|
-
export interface Workload {
|
|
82
|
-
name: string;
|
|
83
|
-
/** System prompt (simulates a realistic coding-agent system prompt). */
|
|
84
|
-
systemPrompt: string;
|
|
85
|
-
/** Tool definitions (names only for the mock). */
|
|
86
|
-
toolNames: string[];
|
|
87
|
-
turns: WorkloadTurn[];
|
|
88
|
-
}
|
|
89
|
-
export interface TurnMetrics {
|
|
90
|
-
turnNumber: number;
|
|
91
|
-
promptPreview: string;
|
|
92
|
-
delayBeforeTurnMs: number;
|
|
93
|
-
ttftMs: number;
|
|
94
|
-
cacheHit: boolean;
|
|
95
|
-
inputTokens: number;
|
|
96
|
-
outputTokens: number;
|
|
97
|
-
wallClockMs: number;
|
|
98
|
-
}
|
|
99
|
-
export interface BenchmarkResult {
|
|
100
|
-
name: string;
|
|
101
|
-
config: MockTimingConfig;
|
|
102
|
-
prewarmed: boolean;
|
|
103
|
-
turns: TurnMetrics[];
|
|
104
|
-
totalWallClockMs: number;
|
|
105
|
-
totalTtftMs: number;
|
|
106
|
-
cacheHits: number;
|
|
107
|
-
cacheMisses: number;
|
|
108
|
-
cacheHitRate: number;
|
|
109
|
-
}
|
|
110
|
-
/** Run a workload against the mock provider and collect per-turn metrics. */
|
|
111
|
-
export declare function runBenchmark(workload: Workload, config: MockTimingConfig, options?: {
|
|
112
|
-
prewarm?: boolean;
|
|
113
|
-
name?: string;
|
|
114
|
-
}): Promise<BenchmarkResult>;
|
|
115
|
-
export interface ComparisonResult {
|
|
116
|
-
baseline: BenchmarkResult;
|
|
117
|
-
optimized: BenchmarkResult;
|
|
118
|
-
wallClockImprovement: number;
|
|
119
|
-
ttftImprovement: number;
|
|
120
|
-
cacheHitRateImprovement: number;
|
|
121
|
-
}
|
|
122
|
-
export declare function compareResults(baseline: BenchmarkResult, optimized: BenchmarkResult): ComparisonResult;
|
|
123
|
-
/** Format a benchmark result as a readable table. */
|
|
124
|
-
export declare function formatResultTable(result: BenchmarkResult): string;
|
|
125
|
-
/** Format a side-by-side comparison. */
|
|
126
|
-
export declare function formatComparison(comparison: ComparisonResult): string;
|
|
127
|
-
/** A realistic multi-turn coding workload with time gaps that expose the
|
|
128
|
-
* 5-min vs 1-h TTL difference. */
|
|
129
|
-
export declare function createDefaultWorkload(): Workload;
|
|
130
|
-
/** Run baseline vs optimized and return the comparison. Uses scaled-down
|
|
131
|
-
* timing (10× faster than real) so the benchmark completes in seconds. */
|
|
132
|
-
export declare function runFullBenchmark(): Promise<ComparisonResult>;
|