@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,518 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hashline (hash-anchored edits) vs current string-match edit — real-API
|
|
3
|
-
* measurement of whether Feature #2 is worth building.
|
|
4
|
-
*
|
|
5
|
-
* Two strategies produce the SAME edit against the SAME file, measured against
|
|
6
|
-
* live gpt-5.5:
|
|
7
|
-
*
|
|
8
|
-
* BASELINE (what ggcoder does today): the model emits { old_text, new_text }
|
|
9
|
-
* edits where old_text must be copied VERBATIM from the file with enough
|
|
10
|
-
* surrounding context to match uniquely (this is exactly our edit tool's
|
|
11
|
-
* contract — see tools/edit.ts). The reproduced context is what costs output
|
|
12
|
-
* tokens, and a non-unique / drifted old_text is what causes apply failures.
|
|
13
|
-
*
|
|
14
|
-
* HASHLINE (the proposed feature): every line is shown with a short content-
|
|
15
|
-
* hash anchor (`a3f1│<line>`). The model references anchors instead of
|
|
16
|
-
* reproducing text — it emits { from, to, lines } where from/to are anchors.
|
|
17
|
-
* Anchors are unique by construction, so an edit either resolves exactly or is
|
|
18
|
-
* rejected (never silently corrupts), and the model writes far fewer tokens.
|
|
19
|
-
*
|
|
20
|
-
* We measure, per task: model OUTPUT tokens (the headline -61% claim), whether
|
|
21
|
-
* the edit applied cleanly + produced the correct file, and an anchor-uniqueness
|
|
22
|
-
* / safety check. Edits are graded deterministically — no second model needed.
|
|
23
|
-
*
|
|
24
|
-
* The BASELINE apply path runs ggcoder's REAL edit ladder (fuzzy match +
|
|
25
|
-
* indent-flex + blank-edge strip + dotdotdots — the same edit-diff functions
|
|
26
|
-
* tools/edit.ts uses), so baseline numbers reflect what our tool actually
|
|
27
|
-
* recovers, not a naive exact-replace.
|
|
28
|
-
*
|
|
29
|
-
* Usage:
|
|
30
|
-
* npx tsx src/core/hashline-edit-benchmark.ts
|
|
31
|
-
*
|
|
32
|
-
* Env overrides:
|
|
33
|
-
* GG_HL_PROVIDER / GG_HL_MODEL (default anthropic / claude-sonnet-5)
|
|
34
|
-
* GG_HL_AUTH_KEY (auth.json key when it differs from the provider name,
|
|
35
|
-
* e.g. `xiaomi-credits` for provider `xiaomi`)
|
|
36
|
-
* GG_HL_REPEAT (runs per task, default 1 — raise to average noise)
|
|
37
|
-
*/
|
|
38
|
-
import { stream } from "@kenkaiiii/gg-ai";
|
|
39
|
-
import { AuthStorage } from "./auth-storage.js";
|
|
40
|
-
import { anchorFile } from "./hashline.js";
|
|
41
|
-
import { fuzzyFindText, countOccurrences, applyMissingLeadingWhitespace, applyDotdotdots, stripBlankEdges, } from "../tools/edit-diff.js";
|
|
42
|
-
export function genFile(lines) {
|
|
43
|
-
const head = [
|
|
44
|
-
`import { EventEmitter } from "node:events";`,
|
|
45
|
-
`import { performance } from "node:perf_hooks";`,
|
|
46
|
-
``,
|
|
47
|
-
`/** Auto-generated module with ${lines} lines for benchmarking. */`,
|
|
48
|
-
`export interface Config {`,
|
|
49
|
-
` retries: number;`,
|
|
50
|
-
` timeoutMs: number;`,
|
|
51
|
-
` label: string;`,
|
|
52
|
-
`}`,
|
|
53
|
-
``,
|
|
54
|
-
`const DEFAULT_TIMEOUT = 3000;`,
|
|
55
|
-
``,
|
|
56
|
-
];
|
|
57
|
-
const body = [];
|
|
58
|
-
let n = 0;
|
|
59
|
-
while (head.length + body.length < lines - 12) {
|
|
60
|
-
body.push(`export function task${n}(x: number): number {`, ` // step ${n}`, ` const y = x * ${n + 1} + DEFAULT_TIMEOUT;`, ` return y - ${n};`, `}`, ``);
|
|
61
|
-
n++;
|
|
62
|
-
}
|
|
63
|
-
const tail = [
|
|
64
|
-
`export function computeTimeout(cfg: Config): number {`,
|
|
65
|
-
` return cfg.timeoutMs > 0 ? cfg.timeoutMs : DEFAULT_TIMEOUT;`,
|
|
66
|
-
`}`,
|
|
67
|
-
``,
|
|
68
|
-
`export const SENTINEL_TAIL = "anchor_${lines}_end";`,
|
|
69
|
-
``,
|
|
70
|
-
];
|
|
71
|
-
return [...head, ...body, ...tail].join("\n");
|
|
72
|
-
}
|
|
73
|
-
/** Near-identical handler blocks — uniqueness pressure for string matching. */
|
|
74
|
-
export function genRepetitiveFile(blocks) {
|
|
75
|
-
const out = [
|
|
76
|
-
`import { parse, ok, error, type Request, type Response } from "./http.js";`,
|
|
77
|
-
``,
|
|
78
|
-
];
|
|
79
|
-
for (let i = 0; i < blocks; i++) {
|
|
80
|
-
out.push(`export function handleCase${i}(req: Request): Response {`, ` const value = parse(req);`, ` if (!value) {`, ` return error(400);`, ` }`, ` return ok(value);`, `}`, ``);
|
|
81
|
-
}
|
|
82
|
-
out.push(`export const HANDLER_COUNT = ${blocks};`, ``);
|
|
83
|
-
return out.join("\n");
|
|
84
|
-
}
|
|
85
|
-
export function buildTasks() {
|
|
86
|
-
const sizes = [
|
|
87
|
-
{ name: "small", lines: 40 },
|
|
88
|
-
{ name: "medium", lines: 160 },
|
|
89
|
-
{ name: "large", lines: 420 },
|
|
90
|
-
];
|
|
91
|
-
const sized = sizes.map((s) => ({
|
|
92
|
-
name: s.name,
|
|
93
|
-
approxLines: s.lines,
|
|
94
|
-
file: genFile(s.lines),
|
|
95
|
-
instruction: "Change `computeTimeout` so that when `cfg.retries` is greater than 0 it returns " +
|
|
96
|
-
"`cfg.timeoutMs * cfg.retries` (capped at 30000), otherwise it keeps the existing behaviour. " +
|
|
97
|
-
"Also add a one-line JSDoc comment above the function describing it.",
|
|
98
|
-
mustContain: ["cfg.timeoutMs * cfg.retries", "30000", "computeTimeout"],
|
|
99
|
-
mustPreserve: ["DEFAULT_TIMEOUT = 3000", `SENTINEL_TAIL = "anchor_${s.lines}_end"`, "task0"],
|
|
100
|
-
}));
|
|
101
|
-
// Repetitive: 12 identical bodies; only handleCase7 must change.
|
|
102
|
-
const repFile = genRepetitiveFile(12);
|
|
103
|
-
const repetitive = {
|
|
104
|
-
name: "repeat",
|
|
105
|
-
approxLines: repFile.split("\n").length,
|
|
106
|
-
file: repFile,
|
|
107
|
-
instruction: "In `handleCase7` ONLY, change `error(400)` to `error(422)`. " +
|
|
108
|
-
"Every other handler must keep returning error(400).",
|
|
109
|
-
mustContain: ["error(422)"],
|
|
110
|
-
mustPreserve: ["HANDLER_COUNT = 12", "handleCase0", "handleCase11"],
|
|
111
|
-
validate: (file) => {
|
|
112
|
-
if (countOccurrences(file, "error(422)") !== 1)
|
|
113
|
-
return false;
|
|
114
|
-
if (countOccurrences(file, "error(400)") !== 11)
|
|
115
|
-
return false;
|
|
116
|
-
const seven = file.indexOf("export function handleCase7");
|
|
117
|
-
const eight = file.indexOf("export function handleCase8");
|
|
118
|
-
const idx = file.indexOf("error(422)");
|
|
119
|
-
return seven !== -1 && idx > seven && (eight === -1 || idx < eight);
|
|
120
|
-
},
|
|
121
|
-
};
|
|
122
|
-
// Multi-edit: three scattered changes in one response.
|
|
123
|
-
const multiFile = genFile(200);
|
|
124
|
-
const multi = {
|
|
125
|
-
name: "multi",
|
|
126
|
-
approxLines: 200,
|
|
127
|
-
file: multiFile,
|
|
128
|
-
instruction: "Make THREE changes: (1) rename the constant `DEFAULT_TIMEOUT` to `FALLBACK_TIMEOUT_MS` " +
|
|
129
|
-
"everywhere it appears, (2) add a `maxRetries: number;` field to the `Config` interface, " +
|
|
130
|
-
"(3) in `computeTimeout`, return `0` when `cfg.label` is the empty string (before the " +
|
|
131
|
-
"existing logic).",
|
|
132
|
-
mustContain: ["FALLBACK_TIMEOUT_MS", "maxRetries: number;", "cfg.label"],
|
|
133
|
-
mustPreserve: [`SENTINEL_TAIL = "anchor_200_end"`, "task0"],
|
|
134
|
-
validate: (file) => countOccurrences(file, "DEFAULT_TIMEOUT") === 0,
|
|
135
|
-
};
|
|
136
|
-
return [...sized, repetitive, multi];
|
|
137
|
-
}
|
|
138
|
-
// ── Hashline anchoring lives in ./hashline.ts (shared with the read/edit tools) ──
|
|
139
|
-
// ── Prompts ─────────────────────────────────────────────────
|
|
140
|
-
function baselinePrompt(file, instruction) {
|
|
141
|
-
return [
|
|
142
|
-
{
|
|
143
|
-
role: "system",
|
|
144
|
-
content: "You are a coding agent's edit engine. Apply the edit by emitting search/replace " +
|
|
145
|
-
"operations. Output ONLY raw JSON, no markdown fence, in this shape:\n" +
|
|
146
|
-
`{"edits":[{"old_text":"<verbatim slice from the file>","new_text":"<replacement>"}]}\n` +
|
|
147
|
-
"RULES: old_text MUST be copied verbatim from the file, including enough surrounding " +
|
|
148
|
-
"context lines that it matches EXACTLY ONE location. Do not paraphrase. Do not explain.",
|
|
149
|
-
},
|
|
150
|
-
{ role: "user", content: `FILE:\n\`\`\`ts\n${file}\n\`\`\`\n\nEDIT: ${instruction}` },
|
|
151
|
-
];
|
|
152
|
-
}
|
|
153
|
-
function hashlinePrompt(rendered, instruction) {
|
|
154
|
-
return [
|
|
155
|
-
{
|
|
156
|
-
role: "system",
|
|
157
|
-
content: "You are a coding agent's edit engine. The file is shown with a unique 4-char anchor " +
|
|
158
|
-
"before each line as `anchor│code`. The anchors are NOT part of the file. Apply the edit " +
|
|
159
|
-
"by referencing anchors instead of retyping code. Output ONLY raw JSON, no markdown fence:\n" +
|
|
160
|
-
`{"edits":[{"from":"<anchor>","to":"<anchor>","lines":["<new line 1>","<new line 2>"]}]}\n` +
|
|
161
|
-
"Each edit REPLACES the inclusive span of lines from anchor `from` to anchor `to` with the " +
|
|
162
|
-
"`lines` array (write the full replacement lines, with correct indentation; never include the " +
|
|
163
|
-
"anchor prefixes). For a single-line change, set from === to. To ADD new lines (e.g. a JSDoc " +
|
|
164
|
-
"comment above a function), pick the existing line you are augmenting as both from and to, and " +
|
|
165
|
-
"put [new line(s), ...that original line] in `lines`. Every `from`/`to` MUST be an anchor that " +
|
|
166
|
-
"appears in the file. Do not explain.",
|
|
167
|
-
},
|
|
168
|
-
{ role: "user", content: `FILE (anchored):\n${rendered}\n\nEDIT: ${instruction}` },
|
|
169
|
-
];
|
|
170
|
-
}
|
|
171
|
-
export function stripFence(s) {
|
|
172
|
-
return s
|
|
173
|
-
.trim()
|
|
174
|
-
.replace(/^```[a-z]*\n?/i, "")
|
|
175
|
-
.replace(/\n?```$/i, "")
|
|
176
|
-
.trim();
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Parse the model's JSON envelope, tolerating literal (unescaped) newlines and
|
|
180
|
-
* tabs inside string values. In production, edits arrive as STRUCTURED
|
|
181
|
-
* tool-call arguments — the JSON envelope is a benchmark artifact — so both
|
|
182
|
-
* strategies get the same repair to keep the comparison about the EDIT FORMAT,
|
|
183
|
-
* not about JSON string-escaping discipline.
|
|
184
|
-
*/
|
|
185
|
-
export function parseEnvelope(raw) {
|
|
186
|
-
const text = stripFence(raw);
|
|
187
|
-
try {
|
|
188
|
-
return JSON.parse(text);
|
|
189
|
-
}
|
|
190
|
-
catch {
|
|
191
|
-
// Repair pass: escape raw control chars that appear inside string literals.
|
|
192
|
-
let out = "";
|
|
193
|
-
let inString = false;
|
|
194
|
-
let escaped = false;
|
|
195
|
-
for (const ch of text) {
|
|
196
|
-
if (inString) {
|
|
197
|
-
if (escaped) {
|
|
198
|
-
out += ch;
|
|
199
|
-
escaped = false;
|
|
200
|
-
continue;
|
|
201
|
-
}
|
|
202
|
-
if (ch === "\\") {
|
|
203
|
-
out += ch;
|
|
204
|
-
escaped = true;
|
|
205
|
-
continue;
|
|
206
|
-
}
|
|
207
|
-
if (ch === '"') {
|
|
208
|
-
inString = false;
|
|
209
|
-
out += ch;
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
if (ch === "\n") {
|
|
213
|
-
out += "\\n";
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
if (ch === "\r") {
|
|
217
|
-
out += "\\r";
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
220
|
-
if (ch === "\t") {
|
|
221
|
-
out += "\\t";
|
|
222
|
-
continue;
|
|
223
|
-
}
|
|
224
|
-
out += ch;
|
|
225
|
-
continue;
|
|
226
|
-
}
|
|
227
|
-
if (ch === '"')
|
|
228
|
-
inString = true;
|
|
229
|
-
out += ch;
|
|
230
|
-
}
|
|
231
|
-
try {
|
|
232
|
-
return JSON.parse(out);
|
|
233
|
-
}
|
|
234
|
-
catch {
|
|
235
|
-
return null;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
export function checkAnchors(file, task) {
|
|
240
|
-
for (const s of task.mustContain)
|
|
241
|
-
if (!file.includes(s))
|
|
242
|
-
return false;
|
|
243
|
-
for (const s of task.mustPreserve)
|
|
244
|
-
if (!file.includes(s))
|
|
245
|
-
return false;
|
|
246
|
-
if (task.validate && !task.validate(file))
|
|
247
|
-
return false;
|
|
248
|
-
return true;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* ggcoder's REAL apply ladder, mirroring tools/edit.ts:
|
|
252
|
-
* 1. exact + smart-quote/dash fuzzy
|
|
253
|
-
* 2. indent-flex
|
|
254
|
-
* 3. blank-edge strip, retry 1+2
|
|
255
|
-
* 4. dotdotdots elision
|
|
256
|
-
* Returns the new working buffer or a failure reason.
|
|
257
|
-
*/
|
|
258
|
-
export function applyLadder(working, oldText, newText) {
|
|
259
|
-
const occurrences = countOccurrences(working, oldText);
|
|
260
|
-
if (occurrences > 1)
|
|
261
|
-
return { ok: false, reason: "ambiguous" };
|
|
262
|
-
if (occurrences === 1) {
|
|
263
|
-
const match = fuzzyFindText(working, oldText);
|
|
264
|
-
if (match.found) {
|
|
265
|
-
return {
|
|
266
|
-
ok: true,
|
|
267
|
-
working: working.slice(0, match.index) + newText + working.slice(match.index + match.matchLength),
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
// not_found → fallback ladder (ambiguous deliberately does not fall through)
|
|
272
|
-
const flexed = applyMissingLeadingWhitespace(working, oldText, newText);
|
|
273
|
-
if (flexed !== null)
|
|
274
|
-
return { ok: true, working: flexed };
|
|
275
|
-
const stripped = stripBlankEdges(oldText);
|
|
276
|
-
if (stripped !== null) {
|
|
277
|
-
const strippedFlexed = applyMissingLeadingWhitespace(working, stripped, newText);
|
|
278
|
-
if (strippedFlexed !== null)
|
|
279
|
-
return { ok: true, working: strippedFlexed };
|
|
280
|
-
if (countOccurrences(working, stripped) === 1) {
|
|
281
|
-
const m = fuzzyFindText(working, stripped);
|
|
282
|
-
if (m.found) {
|
|
283
|
-
return {
|
|
284
|
-
ok: true,
|
|
285
|
-
working: working.slice(0, m.index) + newText + working.slice(m.index + m.matchLength),
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
const elided = applyDotdotdots(working, oldText, newText);
|
|
291
|
-
if (elided !== null)
|
|
292
|
-
return { ok: true, working: elided };
|
|
293
|
-
return { ok: false, reason: "not_found" };
|
|
294
|
-
}
|
|
295
|
-
export function applyBaseline(raw, task) {
|
|
296
|
-
const parsed = parseEnvelope(raw);
|
|
297
|
-
if (parsed === null) {
|
|
298
|
-
return { applied: false, correct: false, ambiguousEdits: 0, parsedEdits: 0 };
|
|
299
|
-
}
|
|
300
|
-
const edits = parsed.edits ?? [];
|
|
301
|
-
let file = task.file;
|
|
302
|
-
let applied = edits.length > 0;
|
|
303
|
-
let ambiguous = 0;
|
|
304
|
-
for (const e of edits) {
|
|
305
|
-
// Run the REAL edit ladder (fuzzy + indent-flex + blank-strip + dotdotdots),
|
|
306
|
-
// so the baseline gets full credit for everything our tool recovers today.
|
|
307
|
-
const result = applyLadder(file, e.old_text ?? "", e.new_text ?? "");
|
|
308
|
-
if (result.ok) {
|
|
309
|
-
file = result.working;
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
ambiguous++;
|
|
313
|
-
applied = false;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
return {
|
|
317
|
-
applied,
|
|
318
|
-
correct: applied && checkAnchors(file, task),
|
|
319
|
-
ambiguousEdits: ambiguous,
|
|
320
|
-
parsedEdits: edits.length,
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
export function applyHashline(raw, task, anchored) {
|
|
324
|
-
const parsed = parseEnvelope(raw);
|
|
325
|
-
if (parsed === null) {
|
|
326
|
-
return { applied: false, correct: false, ambiguousEdits: 0, parsedEdits: 0 };
|
|
327
|
-
}
|
|
328
|
-
const edits = parsed.edits ?? [];
|
|
329
|
-
// Resolve every anchor first; reject the whole patch if any is unresolvable
|
|
330
|
-
// (this is the corruption-avoidance property — anchors must hit exactly once).
|
|
331
|
-
let ambiguous = 0;
|
|
332
|
-
const resolved = [];
|
|
333
|
-
for (const e of edits) {
|
|
334
|
-
const from = anchored.anchorToIndex.get(e.from);
|
|
335
|
-
const to = anchored.anchorToIndex.get(e.to);
|
|
336
|
-
if (from === undefined || to === undefined || from > to) {
|
|
337
|
-
ambiguous++;
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
resolved.push({ from, to, lines: e.lines ?? [] });
|
|
341
|
-
}
|
|
342
|
-
if (resolved.length !== edits.length || edits.length === 0) {
|
|
343
|
-
return { applied: false, correct: false, ambiguousEdits: ambiguous, parsedEdits: edits.length };
|
|
344
|
-
}
|
|
345
|
-
// Apply bottom-up so earlier indices stay valid.
|
|
346
|
-
resolved.sort((a, b) => b.from - a.from);
|
|
347
|
-
const out = [...anchored.lines];
|
|
348
|
-
for (const r of resolved)
|
|
349
|
-
out.splice(r.from, r.to - r.from + 1, ...r.lines);
|
|
350
|
-
const file = out.join("\n");
|
|
351
|
-
return {
|
|
352
|
-
applied: true,
|
|
353
|
-
correct: checkAnchors(file, task),
|
|
354
|
-
ambiguousEdits: ambiguous,
|
|
355
|
-
parsedEdits: edits.length,
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
function sleep(ms) {
|
|
359
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
360
|
-
}
|
|
361
|
-
async function call(provider, model, c, messages, maxTokens) {
|
|
362
|
-
let lastErr;
|
|
363
|
-
for (let attempt = 0; attempt < 4; attempt++) {
|
|
364
|
-
try {
|
|
365
|
-
return await callOnce(provider, model, c, messages, maxTokens);
|
|
366
|
-
}
|
|
367
|
-
catch (err) {
|
|
368
|
-
lastErr = err;
|
|
369
|
-
await sleep(2000 * (attempt + 1));
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
throw lastErr;
|
|
373
|
-
}
|
|
374
|
-
async function callOnce(provider, model, c, messages, maxTokens) {
|
|
375
|
-
const start = Date.now();
|
|
376
|
-
let text = "";
|
|
377
|
-
const result = stream({
|
|
378
|
-
provider: provider,
|
|
379
|
-
model,
|
|
380
|
-
messages,
|
|
381
|
-
maxTokens,
|
|
382
|
-
apiKey: c.apiKey,
|
|
383
|
-
baseUrl: c.baseUrl,
|
|
384
|
-
accountId: c.accountId,
|
|
385
|
-
});
|
|
386
|
-
for await (const event of result) {
|
|
387
|
-
if (event.type === "text_delta")
|
|
388
|
-
text += event.text;
|
|
389
|
-
}
|
|
390
|
-
const response = await result.response;
|
|
391
|
-
const content = response.message.content;
|
|
392
|
-
const finalText = typeof content === "string"
|
|
393
|
-
? content
|
|
394
|
-
: content
|
|
395
|
-
.filter((p) => p.type === "text")
|
|
396
|
-
.map((p) => p.text ?? "")
|
|
397
|
-
.join("");
|
|
398
|
-
return {
|
|
399
|
-
text: finalText || text,
|
|
400
|
-
outputTokens: response.usage.outputTokens,
|
|
401
|
-
inputTokens: response.usage.inputTokens,
|
|
402
|
-
wallMs: Date.now() - start,
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
async function main() {
|
|
406
|
-
const provider = process.env.GG_HL_PROVIDER ?? "anthropic";
|
|
407
|
-
const model = process.env.GG_HL_MODEL ?? "claude-sonnet-5";
|
|
408
|
-
const repeat = Math.max(1, parseInt(process.env.GG_HL_REPEAT ?? "1", 10));
|
|
409
|
-
const auth = new AuthStorage();
|
|
410
|
-
await auth.load();
|
|
411
|
-
// Credit-based accounts store under a key that is not the provider name
|
|
412
|
-
// (`xiaomi-credits` serves provider `xiaomi`), so the two stay separable.
|
|
413
|
-
const cr = await auth.resolveCredentials(process.env.GG_HL_AUTH_KEY ?? provider);
|
|
414
|
-
const creds = { apiKey: cr.accessToken, baseUrl: cr.baseUrl, accountId: cr.accountId };
|
|
415
|
-
console.log(`\n🔗 Hashline edit benchmark — ${provider}/${model} (repeat ${repeat})\n`);
|
|
416
|
-
const tasks = buildTasks();
|
|
417
|
-
const rows = [];
|
|
418
|
-
for (const task of tasks) {
|
|
419
|
-
const anchored = anchorFile(task.file);
|
|
420
|
-
const agg = {
|
|
421
|
-
task: task.name,
|
|
422
|
-
lines: task.approxLines,
|
|
423
|
-
baseOutTok: 0,
|
|
424
|
-
baseInTok: 0,
|
|
425
|
-
baseOk: true,
|
|
426
|
-
baseAmbiguous: 0,
|
|
427
|
-
baseMs: 0,
|
|
428
|
-
hlOutTok: 0,
|
|
429
|
-
hlInTok: 0,
|
|
430
|
-
hlOk: true,
|
|
431
|
-
hlAmbiguous: 0,
|
|
432
|
-
hlMs: 0,
|
|
433
|
-
};
|
|
434
|
-
let baseOkCount = 0;
|
|
435
|
-
let hlOkCount = 0;
|
|
436
|
-
for (let r = 0; r < repeat; r++) {
|
|
437
|
-
process.stdout.write(`▶ ${task.name} (${task.approxLines} lines) run ${r + 1}/${repeat}\n`);
|
|
438
|
-
await sleep(1500);
|
|
439
|
-
const base = await call(provider, model, creds, baselinePrompt(task.file, task.instruction), 8192);
|
|
440
|
-
const baseOut = applyBaseline(base.text, task);
|
|
441
|
-
if (!baseOut.correct && process.env.GG_HL_DEBUG) {
|
|
442
|
-
process.stdout.write(` [debug] baseline raw:\n${base.text.slice(0, 1200)}\n`);
|
|
443
|
-
}
|
|
444
|
-
agg.baseOutTok += base.outputTokens;
|
|
445
|
-
agg.baseInTok += base.inputTokens;
|
|
446
|
-
agg.baseAmbiguous += baseOut.ambiguousEdits;
|
|
447
|
-
agg.baseMs += base.wallMs;
|
|
448
|
-
if (baseOut.correct)
|
|
449
|
-
baseOkCount++;
|
|
450
|
-
process.stdout.write(` baseline: ${base.outputTokens} out tok | ${baseOut.correct ? "OK" : "FAIL"}` +
|
|
451
|
-
`${baseOut.ambiguousEdits ? ` (${baseOut.ambiguousEdits} non-unique)` : ""}\n`);
|
|
452
|
-
await sleep(1500);
|
|
453
|
-
// Same cap as baseline — an asymmetric cap truncates multi-edit responses
|
|
454
|
-
// and shows up as a fake FAIL.
|
|
455
|
-
const hl = await call(provider, model, creds, hashlinePrompt(anchored.rendered, task.instruction), 8192);
|
|
456
|
-
const hlOut = applyHashline(hl.text, task, anchored);
|
|
457
|
-
if (!hlOut.correct && process.env.GG_HL_DEBUG) {
|
|
458
|
-
process.stdout.write(` [debug] hashline raw:\n${hl.text.slice(0, 1200)}\n`);
|
|
459
|
-
}
|
|
460
|
-
agg.hlOutTok += hl.outputTokens;
|
|
461
|
-
agg.hlInTok += hl.inputTokens;
|
|
462
|
-
agg.hlAmbiguous += hlOut.ambiguousEdits;
|
|
463
|
-
agg.hlMs += hl.wallMs;
|
|
464
|
-
if (hlOut.correct)
|
|
465
|
-
hlOkCount++;
|
|
466
|
-
process.stdout.write(` hashline: ${hl.outputTokens} out tok | ${hlOut.correct ? "OK" : "FAIL"}` +
|
|
467
|
-
`${hlOut.ambiguousEdits ? ` (${hlOut.ambiguousEdits} unresolved)` : ""}\n\n`);
|
|
468
|
-
}
|
|
469
|
-
agg.baseOutTok = Math.round(agg.baseOutTok / repeat);
|
|
470
|
-
agg.baseInTok = Math.round(agg.baseInTok / repeat);
|
|
471
|
-
agg.baseMs = Math.round(agg.baseMs / repeat);
|
|
472
|
-
agg.hlOutTok = Math.round(agg.hlOutTok / repeat);
|
|
473
|
-
agg.hlInTok = Math.round(agg.hlInTok / repeat);
|
|
474
|
-
agg.hlMs = Math.round(agg.hlMs / repeat);
|
|
475
|
-
agg.baseOk = baseOkCount === repeat;
|
|
476
|
-
agg.hlOk = hlOkCount === repeat;
|
|
477
|
-
rows.push(agg);
|
|
478
|
-
}
|
|
479
|
-
// ── Report ──
|
|
480
|
-
console.log("══════════════════════ RESULTS ══════════════════════\n");
|
|
481
|
-
console.log("Task Lines | base out-tok | hashline out-tok | Δ out | in-tok base/hl | ms base/hl | OK base/hl");
|
|
482
|
-
for (const r of rows) {
|
|
483
|
-
const delta = r.baseOutTok > 0 ? ((r.baseOutTok - r.hlOutTok) / r.baseOutTok) * 100 : 0;
|
|
484
|
-
console.log(`${r.task.padEnd(7)} ${String(r.lines).padStart(4)} | ` +
|
|
485
|
-
`${String(r.baseOutTok).padStart(12)} | ${String(r.hlOutTok).padStart(16)} | ` +
|
|
486
|
-
`${((delta >= 0 ? "-" : "+") + Math.abs(delta).toFixed(0) + "%").padStart(7)} | ` +
|
|
487
|
-
`${String(r.baseInTok).padStart(6)}/${String(r.hlInTok).padStart(6)} | ` +
|
|
488
|
-
`${String(r.baseMs).padStart(5)}/${String(r.hlMs).padStart(5)} | ` +
|
|
489
|
-
`${r.baseOk ? "OK" : "FAIL"}/${r.hlOk ? "OK" : "FAIL"}`);
|
|
490
|
-
}
|
|
491
|
-
const sum = (f) => rows.reduce((s, r) => s + f(r), 0);
|
|
492
|
-
const baseOut = sum((r) => r.baseOutTok);
|
|
493
|
-
const hlOut = sum((r) => r.hlOutTok);
|
|
494
|
-
const baseIn = sum((r) => r.baseInTok);
|
|
495
|
-
const hlIn = sum((r) => r.hlInTok);
|
|
496
|
-
console.log(`\nOutput tokens: baseline ${baseOut} vs hashline ${hlOut} ` +
|
|
497
|
-
`→ ${baseOut > hlOut ? `${(((baseOut - hlOut) / baseOut) * 100).toFixed(0)}% fewer` : "no win"} ` +
|
|
498
|
-
`(claim from oh-my-pi: ~61% fewer)`);
|
|
499
|
-
console.log(`Input tokens: baseline ${baseIn} vs hashline ${hlIn} ` +
|
|
500
|
-
`(hashline adds the anchor column: ${hlIn > baseIn ? `+${(((hlIn - baseIn) / baseIn) * 100).toFixed(0)}% input` : "no overhead"})`);
|
|
501
|
-
console.log(`Correctness: baseline ${rows.filter((r) => r.baseOk).length}/${rows.length}, ` +
|
|
502
|
-
`hashline ${rows.filter((r) => r.hlOk).length}/${rows.length}`);
|
|
503
|
-
console.log(`Locator misses: baseline ${sum((r) => r.baseAmbiguous)} non-unique/not-found, ` +
|
|
504
|
-
`hashline ${sum((r) => r.hlAmbiguous)} unresolved (rejected before corruption)`);
|
|
505
|
-
console.log(`\nVerdict: hashline wins if output-token drop is large AND correctness ≥ baseline. ` +
|
|
506
|
-
`Net input overhead from the anchor column is the cost to weigh against it.\n`);
|
|
507
|
-
}
|
|
508
|
-
// Run when executed directly (not when imported by tests).
|
|
509
|
-
const isDirectRun = process.argv[1]?.endsWith("hashline-edit-benchmark.ts") ||
|
|
510
|
-
process.argv[1]?.endsWith("hashline-edit-benchmark.js") ||
|
|
511
|
-
process.argv[1]?.endsWith("hashline-edit-benchmark");
|
|
512
|
-
if (isDirectRun) {
|
|
513
|
-
main().catch((err) => {
|
|
514
|
-
console.error("Benchmark failed:", err);
|
|
515
|
-
process.exit(1);
|
|
516
|
-
});
|
|
517
|
-
}
|
|
518
|
-
//# sourceMappingURL=hashline-edit-benchmark.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hashline-edit-benchmark.js","sourceRoot":"","sources":["../../src/core/hashline-edit-benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +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
|
-
export declare function grade(answer: string, mustInclude: string[]): boolean;
|