@kenkaiiii/ggcoder 4.14.3 ā 4.15.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/dist/core/code-retrieval.d.ts +13 -0
- package/dist/core/code-retrieval.d.ts.map +1 -0
- package/dist/core/code-retrieval.js +87 -0
- package/dist/core/code-retrieval.js.map +1 -0
- package/dist/core/hashline-edit-benchmark.d.ts +55 -0
- package/dist/core/hashline-edit-benchmark.d.ts.map +1 -0
- package/dist/core/hashline-edit-benchmark.js +342 -0
- package/dist/core/hashline-edit-benchmark.js.map +1 -0
- package/dist/core/hashline-edit-benchmark.test.d.ts +2 -0
- package/dist/core/hashline-edit-benchmark.test.d.ts.map +1 -0
- package/dist/core/hashline-edit-benchmark.test.js +141 -0
- package/dist/core/hashline-edit-benchmark.test.js.map +1 -0
- package/dist/core/hashline.d.ts +50 -0
- package/dist/core/hashline.d.ts.map +1 -0
- package/dist/core/hashline.js +76 -0
- package/dist/core/hashline.js.map +1 -0
- package/dist/core/semantic-search-benchmark.d.ts +37 -0
- package/dist/core/semantic-search-benchmark.d.ts.map +1 -0
- package/dist/core/semantic-search-benchmark.js +211 -0
- package/dist/core/semantic-search-benchmark.js.map +1 -0
- package/dist/core/semantic-search-benchmark.test.d.ts +2 -0
- package/dist/core/semantic-search-benchmark.test.d.ts.map +1 -0
- package/dist/core/semantic-search-benchmark.test.js +89 -0
- package/dist/core/semantic-search-benchmark.test.js.map +1 -0
- package/dist/tools/edit.d.ts +6 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +34 -2
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +112 -0
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +8 -0
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read.d.ts +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +14 -3
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/read.test.js +40 -0
- package/dist/tools/read.test.js.map +1 -1
- package/dist/tools/search-code.d.ts +11 -0
- package/dist/tools/search-code.d.ts.map +1 -0
- package/dist/tools/search-code.js +95 -0
- package/dist/tools/search-code.js.map +1 -0
- package/dist/tools/search-code.test.d.ts +2 -0
- package/dist/tools/search-code.test.d.ts.map +1 -0
- package/dist/tools/search-code.test.js +77 -0
- package/dist/tools/search-code.test.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface Chunk {
|
|
2
|
+
file: string;
|
|
3
|
+
symbol: string;
|
|
4
|
+
text: string;
|
|
5
|
+
/** 1-based line number where the declaration starts (for `file:line` headers). */
|
|
6
|
+
startLine: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function chunkFile(rel: string, source: string): Chunk[];
|
|
9
|
+
export declare function tokenize(s: string): string[];
|
|
10
|
+
export declare function bm25Rank(query: string, chunks: Chunk[], k: number): Chunk[];
|
|
11
|
+
/** Whole-file baseline: rank files by BM25 over their full text, take top-k. */
|
|
12
|
+
export declare function rankFiles(query: string, files: Map<string, string>, k: number): string[];
|
|
13
|
+
//# sourceMappingURL=code-retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-retrieval.d.ts","sourceRoot":"","sources":["../../src/core/code-retrieval.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAoB9D;AAID,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ5C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAyB3E;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQxF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST-aware code retrieval ā the pure, UI-free core shared by the semantic-search
|
|
3
|
+
* benchmark and the `code_search` tool.
|
|
4
|
+
*
|
|
5
|
+
* `chunkFile` parses a TS/JS source into top-level declaration chunks (functions,
|
|
6
|
+
* classes, interfaces, types, enums, consts) with their full bodies; `bm25Rank`
|
|
7
|
+
* ranks chunks against a natural-language query with a real BM25 retriever (no
|
|
8
|
+
* embedding dependency). Delivering only the top-ranked symbol chunks is what
|
|
9
|
+
* cuts the input tokens an agent spends locating code versus reading whole files.
|
|
10
|
+
*/
|
|
11
|
+
import ts from "typescript";
|
|
12
|
+
export function chunkFile(rel, source) {
|
|
13
|
+
const sf = ts.createSourceFile(rel, source, ts.ScriptTarget.Latest, true);
|
|
14
|
+
const chunks = [];
|
|
15
|
+
sf.forEachChild((node) => {
|
|
16
|
+
let symbol = "";
|
|
17
|
+
if (ts.isFunctionDeclaration(node) && node.name)
|
|
18
|
+
symbol = node.name.text;
|
|
19
|
+
else if (ts.isClassDeclaration(node) && node.name)
|
|
20
|
+
symbol = node.name.text;
|
|
21
|
+
else if (ts.isInterfaceDeclaration(node))
|
|
22
|
+
symbol = node.name.text;
|
|
23
|
+
else if (ts.isTypeAliasDeclaration(node))
|
|
24
|
+
symbol = node.name.text;
|
|
25
|
+
else if (ts.isEnumDeclaration(node))
|
|
26
|
+
symbol = node.name.text;
|
|
27
|
+
else if (ts.isVariableStatement(node)) {
|
|
28
|
+
const d = node.declarationList.declarations[0];
|
|
29
|
+
if (d && ts.isIdentifier(d.name))
|
|
30
|
+
symbol = d.name.text;
|
|
31
|
+
}
|
|
32
|
+
if (symbol) {
|
|
33
|
+
const startLine = sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1;
|
|
34
|
+
chunks.push({ file: rel, symbol, text: node.getText(sf), startLine });
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return chunks;
|
|
38
|
+
}
|
|
39
|
+
// āā Real BM25 retriever (no embedding dependency) āā
|
|
40
|
+
export function tokenize(s) {
|
|
41
|
+
return (s
|
|
42
|
+
// split identifiers on camelCase / snake / non-word
|
|
43
|
+
.replace(/([a-z])([A-Z])/g, "$1 $2")
|
|
44
|
+
.toLowerCase()
|
|
45
|
+
.match(/[a-z0-9]+/g) ?? []);
|
|
46
|
+
}
|
|
47
|
+
export function bm25Rank(query, chunks, k) {
|
|
48
|
+
const docs = chunks.map((c) => tokenize(`${c.symbol} ${c.text}`));
|
|
49
|
+
const N = docs.length;
|
|
50
|
+
const avgdl = docs.reduce((s, d) => s + d.length, 0) / Math.max(1, N);
|
|
51
|
+
const df = new Map();
|
|
52
|
+
for (const d of docs)
|
|
53
|
+
for (const t of new Set(d))
|
|
54
|
+
df.set(t, (df.get(t) ?? 0) + 1);
|
|
55
|
+
const idf = (t) => Math.log(1 + (N - (df.get(t) ?? 0) + 0.5) / ((df.get(t) ?? 0) + 0.5));
|
|
56
|
+
const qToks = tokenize(query);
|
|
57
|
+
const k1 = 1.5;
|
|
58
|
+
const b = 0.75;
|
|
59
|
+
const scored = docs.map((d, i) => {
|
|
60
|
+
const tf = new Map();
|
|
61
|
+
for (const t of d)
|
|
62
|
+
tf.set(t, (tf.get(t) ?? 0) + 1);
|
|
63
|
+
let score = 0;
|
|
64
|
+
for (const t of qToks) {
|
|
65
|
+
const f = tf.get(t) ?? 0;
|
|
66
|
+
if (!f)
|
|
67
|
+
continue;
|
|
68
|
+
score += idf(t) * ((f * (k1 + 1)) / (f + k1 * (1 - b + (b * d.length) / avgdl)));
|
|
69
|
+
}
|
|
70
|
+
return { i, score };
|
|
71
|
+
});
|
|
72
|
+
return scored
|
|
73
|
+
.sort((a, b2) => b2.score - a.score)
|
|
74
|
+
.slice(0, k)
|
|
75
|
+
.map((s) => chunks[s.i]);
|
|
76
|
+
}
|
|
77
|
+
/** Whole-file baseline: rank files by BM25 over their full text, take top-k. */
|
|
78
|
+
export function rankFiles(query, files, k) {
|
|
79
|
+
const chunks = [...files].map(([file, text]) => ({
|
|
80
|
+
file,
|
|
81
|
+
symbol: file,
|
|
82
|
+
text,
|
|
83
|
+
startLine: 1,
|
|
84
|
+
}));
|
|
85
|
+
return bm25Rank(query, chunks, k).map((c) => c.file);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=code-retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-retrieval.js","sourceRoot":"","sources":["../../src/core/code-retrieval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
* Usage:
|
|
25
|
+
* npx tsx src/core/hashline-edit-benchmark.ts
|
|
26
|
+
*
|
|
27
|
+
* Env overrides:
|
|
28
|
+
* GG_HL_PROVIDER / GG_HL_MODEL (default openai / gpt-5.5)
|
|
29
|
+
* GG_HL_REPEAT (runs per task, default 1 ā raise to average noise)
|
|
30
|
+
*/
|
|
31
|
+
import { type AnchoredFile } from "./hashline.js";
|
|
32
|
+
export interface EditTask {
|
|
33
|
+
name: string;
|
|
34
|
+
approxLines: number;
|
|
35
|
+
file: string;
|
|
36
|
+
instruction: string;
|
|
37
|
+
/** Substrings that MUST appear in the correctly-edited file. */
|
|
38
|
+
mustContain: string[];
|
|
39
|
+
/** Substrings that MUST still be present (unchanged anchors far from the edit). */
|
|
40
|
+
mustPreserve: string[];
|
|
41
|
+
}
|
|
42
|
+
export declare function genFile(lines: number): string;
|
|
43
|
+
export declare function buildTasks(): EditTask[];
|
|
44
|
+
export interface ApplyOutcome {
|
|
45
|
+
applied: boolean;
|
|
46
|
+
correct: boolean;
|
|
47
|
+
/** edits whose locator was non-unique / unresolvable (would error in the real tool). */
|
|
48
|
+
ambiguousEdits: number;
|
|
49
|
+
parsedEdits: number;
|
|
50
|
+
}
|
|
51
|
+
export declare function stripFence(s: string): string;
|
|
52
|
+
export declare function checkAnchors(file: string, task: EditTask): boolean;
|
|
53
|
+
export declare function applyBaseline(raw: string, task: EditTask): ApplyOutcome;
|
|
54
|
+
export declare function applyHashline(raw: string, task: EditTask, anchored: AnchoredFile): ApplyOutcome;
|
|
55
|
+
//# sourceMappingURL=hashline-edit-benchmark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashline-edit-benchmark.d.ts","sourceRoot":"","sources":["../../src/core/hashline-edit-benchmark.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAI9D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mFAAmF;IACnF,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqC7C;AAED,wBAAgB,UAAU,IAAI,QAAQ,EAAE,CAiBvC;AA2CD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAIlE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,CA2BvE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,GAAG,YAAY,CAmC/F"}
|
|
@@ -0,0 +1,342 @@
|
|
|
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
|
+
* Usage:
|
|
25
|
+
* npx tsx src/core/hashline-edit-benchmark.ts
|
|
26
|
+
*
|
|
27
|
+
* Env overrides:
|
|
28
|
+
* GG_HL_PROVIDER / GG_HL_MODEL (default openai / gpt-5.5)
|
|
29
|
+
* GG_HL_REPEAT (runs per task, default 1 ā raise to average noise)
|
|
30
|
+
*/
|
|
31
|
+
import { stream } from "@kenkaiiii/gg-ai";
|
|
32
|
+
import { AuthStorage } from "./auth-storage.js";
|
|
33
|
+
import { anchorFile } from "./hashline.js";
|
|
34
|
+
export function genFile(lines) {
|
|
35
|
+
const head = [
|
|
36
|
+
`import { EventEmitter } from "node:events";`,
|
|
37
|
+
`import { performance } from "node:perf_hooks";`,
|
|
38
|
+
``,
|
|
39
|
+
`/** Auto-generated module with ${lines} lines for benchmarking. */`,
|
|
40
|
+
`export interface Config {`,
|
|
41
|
+
` retries: number;`,
|
|
42
|
+
` timeoutMs: number;`,
|
|
43
|
+
` label: string;`,
|
|
44
|
+
`}`,
|
|
45
|
+
``,
|
|
46
|
+
`const DEFAULT_TIMEOUT = 3000;`,
|
|
47
|
+
``,
|
|
48
|
+
];
|
|
49
|
+
const body = [];
|
|
50
|
+
let n = 0;
|
|
51
|
+
while (head.length + body.length < lines - 12) {
|
|
52
|
+
body.push(`export function task${n}(x: number): number {`, ` // step ${n}`, ` const y = x * ${n + 1} + DEFAULT_TIMEOUT;`, ` return y - ${n};`, `}`, ``);
|
|
53
|
+
n++;
|
|
54
|
+
}
|
|
55
|
+
const tail = [
|
|
56
|
+
`export function computeTimeout(cfg: Config): number {`,
|
|
57
|
+
` return cfg.timeoutMs > 0 ? cfg.timeoutMs : DEFAULT_TIMEOUT;`,
|
|
58
|
+
`}`,
|
|
59
|
+
``,
|
|
60
|
+
`export const SENTINEL_TAIL = "anchor_${lines}_end";`,
|
|
61
|
+
``,
|
|
62
|
+
];
|
|
63
|
+
return [...head, ...body, ...tail].join("\n");
|
|
64
|
+
}
|
|
65
|
+
export function buildTasks() {
|
|
66
|
+
const sizes = [
|
|
67
|
+
{ name: "small", lines: 40 },
|
|
68
|
+
{ name: "medium", lines: 160 },
|
|
69
|
+
{ name: "large", lines: 420 },
|
|
70
|
+
];
|
|
71
|
+
return sizes.map((s) => ({
|
|
72
|
+
name: s.name,
|
|
73
|
+
approxLines: s.lines,
|
|
74
|
+
file: genFile(s.lines),
|
|
75
|
+
instruction: "Change `computeTimeout` so that when `cfg.retries` is greater than 0 it returns " +
|
|
76
|
+
"`cfg.timeoutMs * cfg.retries` (capped at 30000), otherwise it keeps the existing behaviour. " +
|
|
77
|
+
"Also add a one-line JSDoc comment above the function describing it.",
|
|
78
|
+
mustContain: ["cfg.timeoutMs * cfg.retries", "30000", "computeTimeout"],
|
|
79
|
+
mustPreserve: ["DEFAULT_TIMEOUT = 3000", `SENTINEL_TAIL = "anchor_${s.lines}_end"`, "task0"],
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
// āā Hashline anchoring lives in ./hashline.ts (shared with the read/edit tools) āā
|
|
83
|
+
// āā Prompts āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
84
|
+
function baselinePrompt(file, instruction) {
|
|
85
|
+
return [
|
|
86
|
+
{
|
|
87
|
+
role: "system",
|
|
88
|
+
content: "You are a coding agent's edit engine. Apply the edit by emitting search/replace " +
|
|
89
|
+
"operations. Output ONLY raw JSON, no markdown fence, in this shape:\n" +
|
|
90
|
+
`{"edits":[{"old_text":"<verbatim slice from the file>","new_text":"<replacement>"}]}\n` +
|
|
91
|
+
"RULES: old_text MUST be copied verbatim from the file, including enough surrounding " +
|
|
92
|
+
"context lines that it matches EXACTLY ONE location. Do not paraphrase. Do not explain.",
|
|
93
|
+
},
|
|
94
|
+
{ role: "user", content: `FILE:\n\`\`\`ts\n${file}\n\`\`\`\n\nEDIT: ${instruction}` },
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
function hashlinePrompt(rendered, instruction) {
|
|
98
|
+
return [
|
|
99
|
+
{
|
|
100
|
+
role: "system",
|
|
101
|
+
content: "You are a coding agent's edit engine. The file is shown with a unique 4-char anchor " +
|
|
102
|
+
"before each line as `anchorācode`. The anchors are NOT part of the file. Apply the edit " +
|
|
103
|
+
"by referencing anchors instead of retyping code. Output ONLY raw JSON, no markdown fence:\n" +
|
|
104
|
+
`{"edits":[{"from":"<anchor>","to":"<anchor>","lines":["<new line 1>","<new line 2>"]}]}\n` +
|
|
105
|
+
"Each edit REPLACES the inclusive span of lines from anchor `from` to anchor `to` with the " +
|
|
106
|
+
"`lines` array (write the full replacement lines, with correct indentation; never include the " +
|
|
107
|
+
"anchor prefixes). For a single-line change, set from === to. To ADD new lines (e.g. a JSDoc " +
|
|
108
|
+
"comment above a function), pick the existing line you are augmenting as both from and to, and " +
|
|
109
|
+
"put [new line(s), ...that original line] in `lines`. Every `from`/`to` MUST be an anchor that " +
|
|
110
|
+
"appears in the file. Do not explain.",
|
|
111
|
+
},
|
|
112
|
+
{ role: "user", content: `FILE (anchored):\n${rendered}\n\nEDIT: ${instruction}` },
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
export function stripFence(s) {
|
|
116
|
+
return s
|
|
117
|
+
.trim()
|
|
118
|
+
.replace(/^```[a-z]*\n?/i, "")
|
|
119
|
+
.replace(/\n?```$/i, "")
|
|
120
|
+
.trim();
|
|
121
|
+
}
|
|
122
|
+
export function checkAnchors(file, task) {
|
|
123
|
+
for (const s of task.mustContain)
|
|
124
|
+
if (!file.includes(s))
|
|
125
|
+
return false;
|
|
126
|
+
for (const s of task.mustPreserve)
|
|
127
|
+
if (!file.includes(s))
|
|
128
|
+
return false;
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
export function applyBaseline(raw, task) {
|
|
132
|
+
let parsed;
|
|
133
|
+
try {
|
|
134
|
+
parsed = JSON.parse(stripFence(raw));
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return { applied: false, correct: false, ambiguousEdits: 0, parsedEdits: 0 };
|
|
138
|
+
}
|
|
139
|
+
const edits = parsed.edits ?? [];
|
|
140
|
+
let file = task.file;
|
|
141
|
+
let applied = edits.length > 0;
|
|
142
|
+
let ambiguous = 0;
|
|
143
|
+
for (const e of edits) {
|
|
144
|
+
const occ = file.split(e.old_text).length - 1;
|
|
145
|
+
if (occ === 1) {
|
|
146
|
+
file = file.replace(e.old_text, e.new_text);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// 0 = not found (drift/paraphrase), >1 = non-unique ā our real tool rejects both.
|
|
150
|
+
ambiguous++;
|
|
151
|
+
applied = false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
applied,
|
|
156
|
+
correct: applied && checkAnchors(file, task),
|
|
157
|
+
ambiguousEdits: ambiguous,
|
|
158
|
+
parsedEdits: edits.length,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export function applyHashline(raw, task, anchored) {
|
|
162
|
+
let parsed;
|
|
163
|
+
try {
|
|
164
|
+
parsed = JSON.parse(stripFence(raw));
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return { applied: false, correct: false, ambiguousEdits: 0, parsedEdits: 0 };
|
|
168
|
+
}
|
|
169
|
+
const edits = parsed.edits ?? [];
|
|
170
|
+
// Resolve every anchor first; reject the whole patch if any is unresolvable
|
|
171
|
+
// (this is the corruption-avoidance property ā anchors must hit exactly once).
|
|
172
|
+
let ambiguous = 0;
|
|
173
|
+
const resolved = [];
|
|
174
|
+
for (const e of edits) {
|
|
175
|
+
const from = anchored.anchorToIndex.get(e.from);
|
|
176
|
+
const to = anchored.anchorToIndex.get(e.to);
|
|
177
|
+
if (from === undefined || to === undefined || from > to) {
|
|
178
|
+
ambiguous++;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
resolved.push({ from, to, lines: e.lines ?? [] });
|
|
182
|
+
}
|
|
183
|
+
if (resolved.length !== edits.length || edits.length === 0) {
|
|
184
|
+
return { applied: false, correct: false, ambiguousEdits: ambiguous, parsedEdits: edits.length };
|
|
185
|
+
}
|
|
186
|
+
// Apply bottom-up so earlier indices stay valid.
|
|
187
|
+
resolved.sort((a, b) => b.from - a.from);
|
|
188
|
+
const out = [...anchored.lines];
|
|
189
|
+
for (const r of resolved)
|
|
190
|
+
out.splice(r.from, r.to - r.from + 1, ...r.lines);
|
|
191
|
+
const file = out.join("\n");
|
|
192
|
+
return {
|
|
193
|
+
applied: true,
|
|
194
|
+
correct: checkAnchors(file, task),
|
|
195
|
+
ambiguousEdits: ambiguous,
|
|
196
|
+
parsedEdits: edits.length,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function sleep(ms) {
|
|
200
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
201
|
+
}
|
|
202
|
+
async function call(provider, model, c, messages, maxTokens) {
|
|
203
|
+
let lastErr;
|
|
204
|
+
for (let attempt = 0; attempt < 4; attempt++) {
|
|
205
|
+
try {
|
|
206
|
+
return await callOnce(provider, model, c, messages, maxTokens);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
lastErr = err;
|
|
210
|
+
await sleep(2000 * (attempt + 1));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
throw lastErr;
|
|
214
|
+
}
|
|
215
|
+
async function callOnce(provider, model, c, messages, maxTokens) {
|
|
216
|
+
const start = Date.now();
|
|
217
|
+
let text = "";
|
|
218
|
+
const result = stream({
|
|
219
|
+
provider: provider,
|
|
220
|
+
model,
|
|
221
|
+
messages,
|
|
222
|
+
maxTokens,
|
|
223
|
+
apiKey: c.apiKey,
|
|
224
|
+
baseUrl: c.baseUrl,
|
|
225
|
+
accountId: c.accountId,
|
|
226
|
+
});
|
|
227
|
+
for await (const event of result) {
|
|
228
|
+
if (event.type === "text_delta")
|
|
229
|
+
text += event.text;
|
|
230
|
+
}
|
|
231
|
+
const response = await result.response;
|
|
232
|
+
const content = response.message.content;
|
|
233
|
+
const finalText = typeof content === "string"
|
|
234
|
+
? content
|
|
235
|
+
: content
|
|
236
|
+
.filter((p) => p.type === "text")
|
|
237
|
+
.map((p) => p.text ?? "")
|
|
238
|
+
.join("");
|
|
239
|
+
return {
|
|
240
|
+
text: finalText || text,
|
|
241
|
+
outputTokens: response.usage.outputTokens,
|
|
242
|
+
inputTokens: response.usage.inputTokens,
|
|
243
|
+
wallMs: Date.now() - start,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
async function main() {
|
|
247
|
+
const provider = process.env.GG_HL_PROVIDER ?? "openai";
|
|
248
|
+
const model = process.env.GG_HL_MODEL ?? "gpt-5.5";
|
|
249
|
+
const repeat = Math.max(1, parseInt(process.env.GG_HL_REPEAT ?? "1", 10));
|
|
250
|
+
const auth = new AuthStorage();
|
|
251
|
+
await auth.load();
|
|
252
|
+
const cr = await auth.resolveCredentials(provider);
|
|
253
|
+
const creds = { apiKey: cr.accessToken, baseUrl: cr.baseUrl, accountId: cr.accountId };
|
|
254
|
+
console.log(`\nš Hashline edit benchmark ā ${provider}/${model} (repeat ${repeat})\n`);
|
|
255
|
+
const tasks = buildTasks();
|
|
256
|
+
const rows = [];
|
|
257
|
+
for (const task of tasks) {
|
|
258
|
+
const anchored = anchorFile(task.file);
|
|
259
|
+
const agg = {
|
|
260
|
+
task: task.name,
|
|
261
|
+
lines: task.approxLines,
|
|
262
|
+
baseOutTok: 0,
|
|
263
|
+
baseInTok: 0,
|
|
264
|
+
baseOk: true,
|
|
265
|
+
baseAmbiguous: 0,
|
|
266
|
+
hlOutTok: 0,
|
|
267
|
+
hlInTok: 0,
|
|
268
|
+
hlOk: true,
|
|
269
|
+
hlAmbiguous: 0,
|
|
270
|
+
};
|
|
271
|
+
let baseOkCount = 0;
|
|
272
|
+
let hlOkCount = 0;
|
|
273
|
+
for (let r = 0; r < repeat; r++) {
|
|
274
|
+
process.stdout.write(`ā¶ ${task.name} (${task.approxLines} lines) run ${r + 1}/${repeat}\n`);
|
|
275
|
+
await sleep(1500);
|
|
276
|
+
const base = await call(provider, model, creds, baselinePrompt(task.file, task.instruction), 4096);
|
|
277
|
+
const baseOut = applyBaseline(base.text, task);
|
|
278
|
+
agg.baseOutTok += base.outputTokens;
|
|
279
|
+
agg.baseInTok += base.inputTokens;
|
|
280
|
+
agg.baseAmbiguous += baseOut.ambiguousEdits;
|
|
281
|
+
if (baseOut.correct)
|
|
282
|
+
baseOkCount++;
|
|
283
|
+
process.stdout.write(` baseline: ${base.outputTokens} out tok | ${baseOut.correct ? "OK" : "FAIL"}` +
|
|
284
|
+
`${baseOut.ambiguousEdits ? ` (${baseOut.ambiguousEdits} non-unique)` : ""}\n`);
|
|
285
|
+
await sleep(1500);
|
|
286
|
+
const hl = await call(provider, model, creds, hashlinePrompt(anchored.rendered, task.instruction), 2048);
|
|
287
|
+
const hlOut = applyHashline(hl.text, task, anchored);
|
|
288
|
+
agg.hlOutTok += hl.outputTokens;
|
|
289
|
+
agg.hlInTok += hl.inputTokens;
|
|
290
|
+
agg.hlAmbiguous += hlOut.ambiguousEdits;
|
|
291
|
+
if (hlOut.correct)
|
|
292
|
+
hlOkCount++;
|
|
293
|
+
process.stdout.write(` hashline: ${hl.outputTokens} out tok | ${hlOut.correct ? "OK" : "FAIL"}` +
|
|
294
|
+
`${hlOut.ambiguousEdits ? ` (${hlOut.ambiguousEdits} unresolved)` : ""}\n\n`);
|
|
295
|
+
}
|
|
296
|
+
agg.baseOutTok = Math.round(agg.baseOutTok / repeat);
|
|
297
|
+
agg.baseInTok = Math.round(agg.baseInTok / repeat);
|
|
298
|
+
agg.hlOutTok = Math.round(agg.hlOutTok / repeat);
|
|
299
|
+
agg.hlInTok = Math.round(agg.hlInTok / repeat);
|
|
300
|
+
agg.baseOk = baseOkCount === repeat;
|
|
301
|
+
agg.hlOk = hlOkCount === repeat;
|
|
302
|
+
rows.push(agg);
|
|
303
|
+
}
|
|
304
|
+
// āā Report āā
|
|
305
|
+
console.log("āāāāāāāāāāāāāāāāāāāāāā RESULTS āāāāāāāāāāāāāāāāāāāāāā\n");
|
|
306
|
+
console.log("Task Lines | base out-tok | hashline out-tok | Ī out | in-tok base/hl | OK base/hl");
|
|
307
|
+
for (const r of rows) {
|
|
308
|
+
const delta = r.baseOutTok > 0 ? ((r.baseOutTok - r.hlOutTok) / r.baseOutTok) * 100 : 0;
|
|
309
|
+
console.log(`${r.task.padEnd(7)} ${String(r.lines).padStart(4)} | ` +
|
|
310
|
+
`${String(r.baseOutTok).padStart(12)} | ${String(r.hlOutTok).padStart(16)} | ` +
|
|
311
|
+
`${((delta >= 0 ? "-" : "+") + Math.abs(delta).toFixed(0) + "%").padStart(7)} | ` +
|
|
312
|
+
`${String(r.baseInTok).padStart(6)}/${String(r.hlInTok).padStart(6)} | ` +
|
|
313
|
+
`${r.baseOk ? "OK" : "FAIL"}/${r.hlOk ? "OK" : "FAIL"}`);
|
|
314
|
+
}
|
|
315
|
+
const sum = (f) => rows.reduce((s, r) => s + f(r), 0);
|
|
316
|
+
const baseOut = sum((r) => r.baseOutTok);
|
|
317
|
+
const hlOut = sum((r) => r.hlOutTok);
|
|
318
|
+
const baseIn = sum((r) => r.baseInTok);
|
|
319
|
+
const hlIn = sum((r) => r.hlInTok);
|
|
320
|
+
console.log(`\nOutput tokens: baseline ${baseOut} vs hashline ${hlOut} ` +
|
|
321
|
+
`ā ${baseOut > hlOut ? `${(((baseOut - hlOut) / baseOut) * 100).toFixed(0)}% fewer` : "no win"} ` +
|
|
322
|
+
`(claim from oh-my-pi: ~61% fewer)`);
|
|
323
|
+
console.log(`Input tokens: baseline ${baseIn} vs hashline ${hlIn} ` +
|
|
324
|
+
`(hashline adds the anchor column: ${hlIn > baseIn ? `+${(((hlIn - baseIn) / baseIn) * 100).toFixed(0)}% input` : "no overhead"})`);
|
|
325
|
+
console.log(`Correctness: baseline ${rows.filter((r) => r.baseOk).length}/${rows.length}, ` +
|
|
326
|
+
`hashline ${rows.filter((r) => r.hlOk).length}/${rows.length}`);
|
|
327
|
+
console.log(`Locator misses: baseline ${sum((r) => r.baseAmbiguous)} non-unique/not-found, ` +
|
|
328
|
+
`hashline ${sum((r) => r.hlAmbiguous)} unresolved (rejected before corruption)`);
|
|
329
|
+
console.log(`\nVerdict: hashline wins if output-token drop is large AND correctness ā„ baseline. ` +
|
|
330
|
+
`Net input overhead from the anchor column is the cost to weigh against it.\n`);
|
|
331
|
+
}
|
|
332
|
+
// Run when executed directly (not when imported by tests).
|
|
333
|
+
const isDirectRun = process.argv[1]?.endsWith("hashline-edit-benchmark.ts") ||
|
|
334
|
+
process.argv[1]?.endsWith("hashline-edit-benchmark.js") ||
|
|
335
|
+
process.argv[1]?.endsWith("hashline-edit-benchmark");
|
|
336
|
+
if (isDirectRun) {
|
|
337
|
+
main().catch((err) => {
|
|
338
|
+
console.error("Benchmark failed:", err);
|
|
339
|
+
process.exit(1);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=hashline-edit-benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashline-edit-benchmark.js","sourceRoot":"","sources":["../../src/core/hashline-edit-benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashline-edit-benchmark.test.d.ts","sourceRoot":"","sources":["../../src/core/hashline-edit-benchmark.test.ts"],"names":[],"mappings":""}
|