@webywz/context-diet 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +170 -2
- package/dist/blocks.d.ts +8 -0
- package/dist/blocks.d.ts.map +1 -0
- package/dist/blocks.js +129 -0
- package/dist/blocks.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +149 -0
- package/dist/cli.js.map +1 -0
- package/dist/diet.d.ts +12 -0
- package/dist/diet.d.ts.map +1 -0
- package/dist/diet.js +66 -0
- package/dist/diet.js.map +1 -0
- package/dist/heuristics.d.ts +13 -0
- package/dist/heuristics.d.ts.map +1 -0
- package/dist/heuristics.js +238 -0
- package/dist/heuristics.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.d.ts +12 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +107 -0
- package/dist/llm.js.map +1 -0
- package/dist/package-info.d.ts +5 -0
- package/dist/package-info.d.ts.map +1 -0
- package/dist/package-info.js +13 -0
- package/dist/package-info.js.map +1 -0
- package/dist/parse-args.d.ts +19 -0
- package/dist/parse-args.d.ts.map +1 -0
- package/dist/parse-args.js +172 -0
- package/dist/parse-args.js.map +1 -0
- package/dist/report.d.ts +24 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +56 -0
- package/dist/report.js.map +1 -0
- package/dist/tokens.d.ts +6 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +73 -0
- package/dist/tokens.js.map +1 -0
- package/dist/truncate.d.ts +4 -0
- package/dist/truncate.d.ts.map +1 -0
- package/dist/truncate.js +136 -0
- package/dist/truncate.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -4
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { joinBlocks, parseBlocks } from "./blocks.js";
|
|
2
|
+
const ANSI_RE = /\u001b\[[0-9;?]*[ -/]*[@-~]|\u001b\][^\u0007]*(?:\u0007|\u001b\\)|\u001b[@-_]/g;
|
|
3
|
+
const SIGNATURE_RE = [
|
|
4
|
+
/^\s*sent from my (iphone|ipad|android|galaxy)/i,
|
|
5
|
+
/^\s*get outlook for (ios|android|mac)/i,
|
|
6
|
+
/^\s*this (e-?mail|message) (and any attachments )?(is|are) confidential/i,
|
|
7
|
+
/^\s*confidentiality notice\b/i,
|
|
8
|
+
/^\s*(unsubscribe|manage (your )?preferences)\b/i,
|
|
9
|
+
/^\s*click here to (view|unsubscribe|update)/i,
|
|
10
|
+
/^\s*\[cid:[^\]]+\]\s*$/i,
|
|
11
|
+
/^\s*begin forwarded message\s*$/i,
|
|
12
|
+
/^\s*leaked by|do not share this prompt/i,
|
|
13
|
+
];
|
|
14
|
+
const CHROME_RE = [
|
|
15
|
+
/^\s*\[?(DEBUG|TRACE|VERBOSE)\]?\s*[:\-]?\s*/i,
|
|
16
|
+
/^\s*npm (info|http|timing|notice)\s/i,
|
|
17
|
+
/^\s*downloading (packages|metadata)\.{2,}\s*$/i,
|
|
18
|
+
];
|
|
19
|
+
const DATA_URI_RE = /data:[a-zA-Z0-9.+-]+\/[a-zA-Z0-9.+-]+;base64,[A-Za-z0-9+/]+=*/g;
|
|
20
|
+
const HEAVY_BLOB_RE = /[A-Za-z0-9+/]{120,}={0,2}/g;
|
|
21
|
+
export function stripAnsi(text, cuts) {
|
|
22
|
+
let n = 0;
|
|
23
|
+
const next = text.replace(ANSI_RE, () => {
|
|
24
|
+
n++;
|
|
25
|
+
return "";
|
|
26
|
+
});
|
|
27
|
+
cuts.ansiSequences += n;
|
|
28
|
+
return next;
|
|
29
|
+
}
|
|
30
|
+
export function omitHeavyBlobs(text, cuts) {
|
|
31
|
+
const replace = (blob) => {
|
|
32
|
+
cuts.omittedHeavyBlobs += 1;
|
|
33
|
+
return `[omitted blob: ${blob.length} chars]`;
|
|
34
|
+
};
|
|
35
|
+
const next = text.replace(DATA_URI_RE, replace).replace(HEAVY_BLOB_RE, replace);
|
|
36
|
+
return next.replace(/(\[omitted blob: \d+ chars\]){2,}/g, (run) => {
|
|
37
|
+
const sizes = [...run.matchAll(/(\d+)/g)].map((m) => Number(m[1]));
|
|
38
|
+
const total = sizes.reduce((a, b) => a + b, 0);
|
|
39
|
+
if (sizes.length > 1)
|
|
40
|
+
cuts.omittedHeavyBlobs -= sizes.length - 1;
|
|
41
|
+
return `[omitted blob: ${total} chars]`;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function collapseProseWhitespace(raw, cuts) {
|
|
45
|
+
const next = raw
|
|
46
|
+
.replace(/[ \t]+$/gm, (ws) => {
|
|
47
|
+
if (ws.length)
|
|
48
|
+
cuts.whitespaceRuns += 1;
|
|
49
|
+
return "";
|
|
50
|
+
})
|
|
51
|
+
.replace(/[ \t]{2,}/g, () => {
|
|
52
|
+
cuts.whitespaceRuns += 1;
|
|
53
|
+
return " ";
|
|
54
|
+
});
|
|
55
|
+
return next;
|
|
56
|
+
}
|
|
57
|
+
export function collapseBlankBlocks(blocks, cuts) {
|
|
58
|
+
const out = [];
|
|
59
|
+
for (const block of blocks) {
|
|
60
|
+
if (block.type === "blank") {
|
|
61
|
+
const runs = block.raw.split("\n").length;
|
|
62
|
+
if (out.length === 0)
|
|
63
|
+
continue;
|
|
64
|
+
if (out[out.length - 1]?.type === "blank") {
|
|
65
|
+
cuts.whitespaceRuns += 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (runs > 2)
|
|
69
|
+
cuts.whitespaceRuns += runs - 2;
|
|
70
|
+
out.push({ type: "blank", raw: "\n" });
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (block.type === "code") {
|
|
74
|
+
out.push(block);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
out.push({ ...block, raw: collapseProseWhitespace(block.raw, cuts) });
|
|
78
|
+
}
|
|
79
|
+
while (out.length && out[out.length - 1]?.type === "blank")
|
|
80
|
+
out.pop();
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
function lineFingerprint(line) {
|
|
84
|
+
return line
|
|
85
|
+
.toLowerCase()
|
|
86
|
+
.replace(/\d{4}-\d{2}-\d{2}[ tT]\d{2}:\d{2}:\d{2}(?:[.,]\d+)?(?:z|[+-]\d{2}:?\d{2})?/g, "#ts#")
|
|
87
|
+
.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, "#uuid#")
|
|
88
|
+
.replace(/0x[0-9a-f]+/gi, "#hex#")
|
|
89
|
+
.replace(/\b\d+\b/g, "#n#")
|
|
90
|
+
.replace(/[^a-z0-9#]+/g, " ")
|
|
91
|
+
.replace(/\s+/g, " ")
|
|
92
|
+
.trim();
|
|
93
|
+
}
|
|
94
|
+
function isSignature(line) {
|
|
95
|
+
return SIGNATURE_RE.some((re) => re.test(line));
|
|
96
|
+
}
|
|
97
|
+
function isDecorativeRule(line) {
|
|
98
|
+
return /^[-=*_~.|#]{3,}$/.test(line.trim());
|
|
99
|
+
}
|
|
100
|
+
function isLowValueChrome(line) {
|
|
101
|
+
const t = line.trim();
|
|
102
|
+
if (t.length === 0)
|
|
103
|
+
return false;
|
|
104
|
+
if (isDecorativeRule(line))
|
|
105
|
+
return true;
|
|
106
|
+
return CHROME_RE.some((re) => re.test(line));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Drop repeated log/chrome lines and known signatures, keeping the first few
|
|
110
|
+
* occurrences so the pattern is still visible.
|
|
111
|
+
*/
|
|
112
|
+
export function stripBoilerplate(blocks, cuts) {
|
|
113
|
+
const fingerprints = [];
|
|
114
|
+
for (const block of blocks) {
|
|
115
|
+
if (block.type === "code" || block.type === "blank")
|
|
116
|
+
continue;
|
|
117
|
+
for (const line of block.raw.split("\n")) {
|
|
118
|
+
const fp = lineFingerprint(line);
|
|
119
|
+
if (fp)
|
|
120
|
+
fingerprints.push(fp);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const freq = new Map();
|
|
124
|
+
for (const fp of fingerprints)
|
|
125
|
+
freq.set(fp, (freq.get(fp) ?? 0) + 1);
|
|
126
|
+
const seen = new Map();
|
|
127
|
+
const KEEP_REPEATS = 2;
|
|
128
|
+
const mapBlock = (block) => {
|
|
129
|
+
if (block.type === "code" || block.type === "blank")
|
|
130
|
+
return block;
|
|
131
|
+
if (block.type === "rule") {
|
|
132
|
+
cuts.boilerplateLines += 1;
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const kept = [];
|
|
136
|
+
for (const line of block.raw.split("\n")) {
|
|
137
|
+
if (isSignature(line) || isDecorativeRule(line)) {
|
|
138
|
+
cuts.boilerplateLines += 1;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const fp = lineFingerprint(line);
|
|
142
|
+
const count = fp ? freq.get(fp) ?? 0 : 0;
|
|
143
|
+
const noisyRepeat = Boolean(fp) && count >= 3;
|
|
144
|
+
const chrome = isLowValueChrome(line);
|
|
145
|
+
if (noisyRepeat || (chrome && count >= 2)) {
|
|
146
|
+
const keptAlready = seen.get(fp) ?? 0;
|
|
147
|
+
const cap = chrome ? 1 : KEEP_REPEATS;
|
|
148
|
+
if (keptAlready >= cap) {
|
|
149
|
+
cuts.boilerplateLines += 1;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
seen.set(fp, keptAlready + 1);
|
|
153
|
+
}
|
|
154
|
+
kept.push(line);
|
|
155
|
+
}
|
|
156
|
+
if (kept.length === 0)
|
|
157
|
+
return null;
|
|
158
|
+
if (kept.every((l) => l.trim() === ""))
|
|
159
|
+
return null;
|
|
160
|
+
return { ...block, raw: kept.join("\n") };
|
|
161
|
+
};
|
|
162
|
+
return blocks.map(mapBlock).filter((b) => b !== null);
|
|
163
|
+
}
|
|
164
|
+
function normalizeParagraph(text) {
|
|
165
|
+
return text
|
|
166
|
+
.toLowerCase()
|
|
167
|
+
.replace(/https?:\/\/\S+/g, "#url#")
|
|
168
|
+
.replace(/[^a-z0-9\u4e00-\u9fff\s]/g, " ")
|
|
169
|
+
.replace(/\s+/g, " ")
|
|
170
|
+
.trim();
|
|
171
|
+
}
|
|
172
|
+
function jaccard(a, b) {
|
|
173
|
+
const wa = a.split(" ").filter(Boolean);
|
|
174
|
+
const wb = b.split(" ").filter(Boolean);
|
|
175
|
+
if (wa.length === 0 && wb.length === 0)
|
|
176
|
+
return 1;
|
|
177
|
+
const sa = new Set(wa);
|
|
178
|
+
const sb = new Set(wb);
|
|
179
|
+
let inter = 0;
|
|
180
|
+
for (const w of sa)
|
|
181
|
+
if (sb.has(w))
|
|
182
|
+
inter++;
|
|
183
|
+
const union = sa.size + sb.size - inter;
|
|
184
|
+
return union === 0 ? 0 : inter / union;
|
|
185
|
+
}
|
|
186
|
+
const DEDUPE_THRESHOLD = 0.84;
|
|
187
|
+
export function dedupeParagraphs(blocks, cuts) {
|
|
188
|
+
const seenExact = new Set();
|
|
189
|
+
const seenFuzzy = [];
|
|
190
|
+
const out = [];
|
|
191
|
+
for (const block of blocks) {
|
|
192
|
+
if (block.type === "code" || block.type === "blank" || block.type === "heading") {
|
|
193
|
+
out.push(block);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const norm = normalizeParagraph(block.raw);
|
|
197
|
+
if (!norm) {
|
|
198
|
+
out.push(block);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (seenExact.has(norm)) {
|
|
202
|
+
cuts.duplicateParagraphs += 1;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const words = norm.split(" ").length;
|
|
206
|
+
let dup = false;
|
|
207
|
+
if (words >= 6) {
|
|
208
|
+
for (const prev of seenFuzzy) {
|
|
209
|
+
if (jaccard(norm, prev) >= DEDUPE_THRESHOLD) {
|
|
210
|
+
dup = true;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (dup) {
|
|
216
|
+
cuts.duplicateParagraphs += 1;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
seenExact.add(norm);
|
|
220
|
+
if (words >= 6) {
|
|
221
|
+
seenFuzzy.push(norm);
|
|
222
|
+
if (seenFuzzy.length > 64)
|
|
223
|
+
seenFuzzy.shift();
|
|
224
|
+
}
|
|
225
|
+
out.push(block);
|
|
226
|
+
}
|
|
227
|
+
return out;
|
|
228
|
+
}
|
|
229
|
+
export function tidy(text, cuts) {
|
|
230
|
+
let blocks = parseBlocks(text);
|
|
231
|
+
blocks = collapseBlankBlocks(blocks, cuts);
|
|
232
|
+
blocks = stripBoilerplate(blocks, cuts);
|
|
233
|
+
blocks = collapseBlankBlocks(blocks, cuts);
|
|
234
|
+
blocks = dedupeParagraphs(blocks, cuts);
|
|
235
|
+
blocks = collapseBlankBlocks(blocks, cuts);
|
|
236
|
+
return joinBlocks(blocks);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=heuristics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heuristics.js","sourceRoot":"","sources":["../src/heuristics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAc,MAAM,aAAa,CAAC;AAGlE,MAAM,OAAO,GAAG,gFAAgF,CAAC;AAEjG,MAAM,YAAY,GAAG;IACnB,gDAAgD;IAChD,wCAAwC;IACxC,0EAA0E;IAC1E,+BAA+B;IAC/B,iDAAiD;IACjD,8CAA8C;IAC9C,yBAAyB;IACzB,kCAAkC;IAClC,yCAAyC;CAC1C,CAAC;AAEF,MAAM,SAAS,GAAG;IAChB,8CAA8C;IAC9C,sCAAsC;IACtC,gDAAgD;CACjD,CAAC;AAEF,MAAM,WAAW,GACf,gEAAgE,CAAC;AACnE,MAAM,aAAa,GAAG,4BAA4B,CAAC;AAEnD,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAe;IACrD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE;QACtC,CAAC,EAAE,CAAC;QACJ,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAe;IAC1D,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE;QACvC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAC5B,OAAO,kBAAkB,IAAI,CAAC,MAAM,SAAS,CAAC;IAChD,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,OAAO,CACjB,oCAAoC,EACpC,CAAC,GAAG,EAAE,EAAE;QACN,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjE,OAAO,kBAAkB,KAAK,SAAS,CAAC;IAC1C,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAW,EAAE,IAAe;IAC3D,MAAM,IAAI,GAAG,GAAG;SACb,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE;QAC3B,IAAI,EAAE,CAAC,MAAM;YAAE,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,OAAO,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IACL,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAe,EAAE,IAAe;IAClE,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAC1C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC/B,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1C,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,IAAI,IAAI,GAAG,CAAC;gBAAE,IAAI,CAAC,cAAc,IAAI,IAAI,GAAG,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,uBAAuB,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO;QAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IACtE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,6EAA6E,EAAE,MAAM,CAAC;SAC9F,OAAO,CACN,gEAAgE,EAChE,QAAQ,CACT;SACA,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC;SACjC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;SAC1B,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAe,EAAE,IAAe;IAC/D,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,SAAS;QAC9D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,EAAE;gBAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,EAAE,IAAI,YAAY;QAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAErE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,MAAM,YAAY,GAAG,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAgB,EAAE;QAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QAClE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,WAAW,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gBACtC,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;oBACvB,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;oBAC3B,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACpD,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5C,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAc,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,CAAS,EAAE,CAAS;IACnC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;IACvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC;IACxC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,UAAU,gBAAgB,CAAC,MAAe,EAAE,IAAe;IAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAY,EAAE,CAAC;IAExB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAChF,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACrC,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC;oBAC5C,GAAG,GAAG,IAAI,CAAC;oBACX,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE;gBAAE,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/C,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,IAAe;IAChD,IAAI,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { parseBlocks, joinBlocks, type Block, type BlockType } from "./blocks.js";
|
|
2
|
+
export { diet, dietAsync } from "./diet.js";
|
|
3
|
+
export { deepenText, DeepenError, hasAnyKey, resolveProvider } from "./llm.js";
|
|
4
|
+
export { estimateTokens, snapshot } from "./tokens.js";
|
|
5
|
+
export { formatHumanReport, toJsonReport, type JsonReport } from "./report.js";
|
|
6
|
+
export { KEEP_CATEGORIES, emptyCuts, type CutCounts, type DietOptions, type DietResult, type KeepCategory, type LlmProvider, type SizeSnapshot, } from "./types.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EACL,eAAe,EACf,SAAS,EACT,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { parseBlocks, joinBlocks } from "./blocks.js";
|
|
2
|
+
export { diet, dietAsync } from "./diet.js";
|
|
3
|
+
export { deepenText, DeepenError, hasAnyKey, resolveProvider } from "./llm.js";
|
|
4
|
+
export { estimateTokens, snapshot } from "./tokens.js";
|
|
5
|
+
export { formatHumanReport, toJsonReport } from "./report.js";
|
|
6
|
+
export { KEEP_CATEGORIES, emptyCuts, } from "./types.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAA8B,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAC;AAC/E,OAAO,EACL,eAAe,EACf,SAAS,GAOV,MAAM,YAAY,CAAC"}
|
package/dist/llm.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LlmProvider } from "./types.js";
|
|
2
|
+
export declare class DeepenError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare function resolveProvider(env: NodeJS.ProcessEnv, requested?: LlmProvider): LlmProvider | null;
|
|
6
|
+
export declare function hasAnyKey(env: NodeJS.ProcessEnv): boolean;
|
|
7
|
+
export declare function deepenText(text: string, options?: {
|
|
8
|
+
provider?: LlmProvider;
|
|
9
|
+
env?: NodeJS.ProcessEnv;
|
|
10
|
+
fetch?: typeof fetch;
|
|
11
|
+
}): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAY9C,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,CAAC,EAAE,WAAW,GACtB,WAAW,GAAG,IAAI,CAKpB;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAEzD;AA4FD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACjB,GACL,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
package/dist/llm.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const OPENAI_URL = "https://api.openai.com/v1/chat/completions";
|
|
2
|
+
const ANTHROPIC_URL = "https://api.anthropic.com/v1/messages";
|
|
3
|
+
const SYSTEM_PROMPT = "You compress context that will be sent to another LLM. " +
|
|
4
|
+
"Remove redundancy, filler, repeated logs, and hedging. " +
|
|
5
|
+
"Keep facts, identifiers, file paths, error messages, code, numbers, and headings. " +
|
|
6
|
+
"Do not add new facts. Do not wrap the result in markdown fences. " +
|
|
7
|
+
"Output only the compressed text.";
|
|
8
|
+
export class DeepenError extends Error {
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "DeepenError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function resolveProvider(env, requested) {
|
|
15
|
+
if (requested)
|
|
16
|
+
return requested;
|
|
17
|
+
if (env.OPENAI_API_KEY)
|
|
18
|
+
return "openai";
|
|
19
|
+
if (env.ANTHROPIC_API_KEY)
|
|
20
|
+
return "anthropic";
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
export function hasAnyKey(env) {
|
|
24
|
+
return Boolean(env.OPENAI_API_KEY || env.ANTHROPIC_API_KEY);
|
|
25
|
+
}
|
|
26
|
+
async function openaiChat(text, env, fetchFn) {
|
|
27
|
+
const key = env.OPENAI_API_KEY;
|
|
28
|
+
if (!key) {
|
|
29
|
+
throw new DeepenError("OPENAI_API_KEY is not set. Pass a key or omit --deepen; the local diet still works.");
|
|
30
|
+
}
|
|
31
|
+
const model = env.OPENAI_MODEL || "gpt-4o-mini";
|
|
32
|
+
const res = await fetchFn(OPENAI_URL, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
authorization: `Bearer ${key}`,
|
|
36
|
+
"content-type": "application/json",
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify({
|
|
39
|
+
model,
|
|
40
|
+
temperature: 0,
|
|
41
|
+
messages: [
|
|
42
|
+
{ role: "system", content: SYSTEM_PROMPT },
|
|
43
|
+
{ role: "user", content: text },
|
|
44
|
+
],
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
const body = await res.text().catch(() => "");
|
|
49
|
+
throw new DeepenError(`OpenAI request failed (${res.status}): ${body.slice(0, 240) || res.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
const json = (await res.json());
|
|
52
|
+
const out = json.choices?.[0]?.message?.content?.trim();
|
|
53
|
+
if (!out)
|
|
54
|
+
throw new DeepenError("OpenAI returned an empty completion.");
|
|
55
|
+
return { text: out };
|
|
56
|
+
}
|
|
57
|
+
async function anthropicChat(text, env, fetchFn) {
|
|
58
|
+
const key = env.ANTHROPIC_API_KEY;
|
|
59
|
+
if (!key) {
|
|
60
|
+
throw new DeepenError("ANTHROPIC_API_KEY is not set. Pass a key or omit --deepen; the local diet still works.");
|
|
61
|
+
}
|
|
62
|
+
const model = env.ANTHROPIC_MODEL || "claude-3-5-haiku-20241022";
|
|
63
|
+
const res = await fetchFn(ANTHROPIC_URL, {
|
|
64
|
+
method: "POST",
|
|
65
|
+
headers: {
|
|
66
|
+
"x-api-key": key,
|
|
67
|
+
"anthropic-version": "2023-06-01",
|
|
68
|
+
"content-type": "application/json",
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
model,
|
|
72
|
+
max_tokens: 4096,
|
|
73
|
+
temperature: 0,
|
|
74
|
+
system: SYSTEM_PROMPT,
|
|
75
|
+
messages: [{ role: "user", content: text }],
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
78
|
+
if (!res.ok) {
|
|
79
|
+
const body = await res.text().catch(() => "");
|
|
80
|
+
throw new DeepenError(`Anthropic request failed (${res.status}): ${body.slice(0, 240) || res.statusText}`);
|
|
81
|
+
}
|
|
82
|
+
const json = (await res.json());
|
|
83
|
+
const out = json.content
|
|
84
|
+
?.filter((p) => p.type === "text" && p.text)
|
|
85
|
+
.map((p) => p.text)
|
|
86
|
+
.join("\n")
|
|
87
|
+
.trim();
|
|
88
|
+
if (!out)
|
|
89
|
+
throw new DeepenError("Anthropic returned an empty completion.");
|
|
90
|
+
return { text: out };
|
|
91
|
+
}
|
|
92
|
+
export async function deepenText(text, options = {}) {
|
|
93
|
+
const env = options.env ?? process.env;
|
|
94
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
95
|
+
if (typeof fetchFn !== "function") {
|
|
96
|
+
throw new DeepenError("fetch is not available. Use Node 18+ or omit --deepen.");
|
|
97
|
+
}
|
|
98
|
+
const provider = resolveProvider(env, options.provider);
|
|
99
|
+
if (!provider) {
|
|
100
|
+
throw new DeepenError("No API key found. Set OPENAI_API_KEY or ANTHROPIC_API_KEY to use --deepen.");
|
|
101
|
+
}
|
|
102
|
+
const result = provider === "openai"
|
|
103
|
+
? await openaiChat(text, env, fetchFn)
|
|
104
|
+
: await anthropicChat(text, env, fetchFn);
|
|
105
|
+
return result.text;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=llm.js.map
|
package/dist/llm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-info.d.ts","sourceRoot":"","sources":["../src/package-info.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAS/D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
let cached;
|
|
5
|
+
export function packageInfo() {
|
|
6
|
+
if (cached)
|
|
7
|
+
return cached;
|
|
8
|
+
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
|
|
9
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
10
|
+
cached = { name: pkg.name, version: pkg.version };
|
|
11
|
+
return cached;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=package-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-info.js","sourceRoot":"","sources":["../src/package-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,IAAI,MAAqD,CAAC;AAE1D,MAAM,UAAU,WAAW;IACzB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAGnD,CAAC;IACF,MAAM,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type KeepCategory, type LlmProvider } from "./types.js";
|
|
2
|
+
export interface CliArgs {
|
|
3
|
+
help: boolean;
|
|
4
|
+
version: boolean;
|
|
5
|
+
json: boolean;
|
|
6
|
+
quiet: boolean;
|
|
7
|
+
deepen: boolean;
|
|
8
|
+
file?: string;
|
|
9
|
+
output?: string;
|
|
10
|
+
maxTokens?: number;
|
|
11
|
+
keep: KeepCategory[];
|
|
12
|
+
provider?: LlmProvider;
|
|
13
|
+
}
|
|
14
|
+
export declare class UsageError extends Error {
|
|
15
|
+
constructor(message: string);
|
|
16
|
+
}
|
|
17
|
+
export declare const HELP_TEXT = "context-diet \u2014 slim LLM context before you send it\n\nUsage:\n context-diet [file] [options]\n cat logs.txt | context-diet --max-tokens 2000\n\nOptions:\n -o, --output <file> Write slimmed text to a file instead of stdout\n --max-tokens <n> Truncate to an estimated token budget\n --keep <cats> Prefer headings, code, lists when truncating\n (comma or pipe: headings|code|lists)\n --json Print a machine-readable report (includes text)\n --deepen Optional LLM pass (OPENAI_API_KEY / ANTHROPIC_API_KEY)\n --provider <name> openai | anthropic (default: first available key)\n -q, --quiet Do not print the human report to stderr\n -h, --help Show this help\n -V, --version Show version\n\nOffline by default. --deepen is never required.\nToken counts are a cl100k-ish heuristic, not a billed tokenizer.\n";
|
|
18
|
+
export declare function parseArgs(argv: string[]): CliArgs;
|
|
19
|
+
//# sourceMappingURL=parse-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAoDD,eAAO,MAAM,SAAS,i8BAqBrB,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA0GjD"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { KEEP_CATEGORIES } from "./types.js";
|
|
2
|
+
export class UsageError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "UsageError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
const KEEP_SET = new Set(KEEP_CATEGORIES);
|
|
9
|
+
const PROVIDERS = new Set(["openai", "anthropic"]);
|
|
10
|
+
function parseKeepValue(raw) {
|
|
11
|
+
const parts = raw
|
|
12
|
+
.split(/[,|]/)
|
|
13
|
+
.map((p) => p.trim().toLowerCase())
|
|
14
|
+
.filter(Boolean);
|
|
15
|
+
if (parts.length === 0) {
|
|
16
|
+
throw new UsageError("Expected --keep headings|code|lists (comma or pipe separated).");
|
|
17
|
+
}
|
|
18
|
+
const out = [];
|
|
19
|
+
for (const part of parts) {
|
|
20
|
+
if (!KEEP_SET.has(part)) {
|
|
21
|
+
throw new UsageError(`Unknown --keep value "${part}". Use headings, code, and/or lists.`);
|
|
22
|
+
}
|
|
23
|
+
out.push(part);
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
function parsePositiveInt(flag, raw) {
|
|
28
|
+
if (!/^\d+$/.test(raw)) {
|
|
29
|
+
throw new UsageError(`${flag} expects a positive integer, got "${raw}".`);
|
|
30
|
+
}
|
|
31
|
+
const n = Number(raw);
|
|
32
|
+
if (!Number.isSafeInteger(n) || n <= 0) {
|
|
33
|
+
throw new UsageError(`${flag} expects a positive integer, got "${raw}".`);
|
|
34
|
+
}
|
|
35
|
+
return n;
|
|
36
|
+
}
|
|
37
|
+
function takeValue(argv, i, flag, inline) {
|
|
38
|
+
if (inline !== undefined && inline !== "")
|
|
39
|
+
return { value: inline, next: i };
|
|
40
|
+
const value = argv[i];
|
|
41
|
+
if (value === undefined || value.startsWith("-")) {
|
|
42
|
+
throw new UsageError(`${flag} requires a value.`);
|
|
43
|
+
}
|
|
44
|
+
return { value, next: i + 1 };
|
|
45
|
+
}
|
|
46
|
+
export const HELP_TEXT = `\
|
|
47
|
+
context-diet — slim LLM context before you send it
|
|
48
|
+
|
|
49
|
+
Usage:
|
|
50
|
+
context-diet [file] [options]
|
|
51
|
+
cat logs.txt | context-diet --max-tokens 2000
|
|
52
|
+
|
|
53
|
+
Options:
|
|
54
|
+
-o, --output <file> Write slimmed text to a file instead of stdout
|
|
55
|
+
--max-tokens <n> Truncate to an estimated token budget
|
|
56
|
+
--keep <cats> Prefer headings, code, lists when truncating
|
|
57
|
+
(comma or pipe: headings|code|lists)
|
|
58
|
+
--json Print a machine-readable report (includes text)
|
|
59
|
+
--deepen Optional LLM pass (OPENAI_API_KEY / ANTHROPIC_API_KEY)
|
|
60
|
+
--provider <name> openai | anthropic (default: first available key)
|
|
61
|
+
-q, --quiet Do not print the human report to stderr
|
|
62
|
+
-h, --help Show this help
|
|
63
|
+
-V, --version Show version
|
|
64
|
+
|
|
65
|
+
Offline by default. --deepen is never required.
|
|
66
|
+
Token counts are a cl100k-ish heuristic, not a billed tokenizer.
|
|
67
|
+
`;
|
|
68
|
+
export function parseArgs(argv) {
|
|
69
|
+
const args = {
|
|
70
|
+
help: false,
|
|
71
|
+
version: false,
|
|
72
|
+
json: false,
|
|
73
|
+
quiet: false,
|
|
74
|
+
deepen: false,
|
|
75
|
+
keep: [],
|
|
76
|
+
};
|
|
77
|
+
for (let i = 0; i < argv.length; i++) {
|
|
78
|
+
const a = argv[i];
|
|
79
|
+
if (a === "--") {
|
|
80
|
+
const rest = argv.slice(i + 1);
|
|
81
|
+
if (rest.length > 1) {
|
|
82
|
+
throw new UsageError(`Unexpected extra arguments: ${rest.slice(1).join(" ")}`);
|
|
83
|
+
}
|
|
84
|
+
if (rest[0] !== undefined) {
|
|
85
|
+
if (args.file)
|
|
86
|
+
throw new UsageError("Pass at most one input file.");
|
|
87
|
+
args.file = rest[0];
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (a === "-h" || a === "--help") {
|
|
92
|
+
args.help = true;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (a === "-V" || a === "--version") {
|
|
96
|
+
args.version = true;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (a === "--json") {
|
|
100
|
+
args.json = true;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (a === "-q" || a === "--quiet") {
|
|
104
|
+
args.quiet = true;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (a === "--deepen") {
|
|
108
|
+
args.deepen = true;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (a === "-o" || a === "--output" || a.startsWith("--output=")) {
|
|
112
|
+
const inline = a.startsWith("--output=") ? a.slice("--output=".length) : undefined;
|
|
113
|
+
const got = takeValue(argv, i + 1, "--output", inline);
|
|
114
|
+
args.output = got.value;
|
|
115
|
+
i = got.next - 1;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (a === "--max-tokens" || a.startsWith("--max-tokens=")) {
|
|
119
|
+
const inline = a.startsWith("--max-tokens=")
|
|
120
|
+
? a.slice("--max-tokens=".length)
|
|
121
|
+
: undefined;
|
|
122
|
+
const got = takeValue(argv, i + 1, "--max-tokens", inline);
|
|
123
|
+
args.maxTokens = parsePositiveInt("--max-tokens", got.value);
|
|
124
|
+
i = got.next - 1;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (a === "--keep" || a.startsWith("--keep=")) {
|
|
128
|
+
const inline = a.startsWith("--keep=") ? a.slice("--keep=".length) : undefined;
|
|
129
|
+
const got = takeValue(argv, i + 1, "--keep", inline);
|
|
130
|
+
args.keep.push(...parseKeepValue(got.value));
|
|
131
|
+
i = got.next - 1;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (a === "--provider" || a.startsWith("--provider=")) {
|
|
135
|
+
const inline = a.startsWith("--provider=")
|
|
136
|
+
? a.slice("--provider=".length)
|
|
137
|
+
: undefined;
|
|
138
|
+
const got = takeValue(argv, i + 1, "--provider", inline);
|
|
139
|
+
const name = got.value.toLowerCase();
|
|
140
|
+
if (!PROVIDERS.has(name)) {
|
|
141
|
+
throw new UsageError(`Unknown --provider "${got.value}". Use openai or anthropic.`);
|
|
142
|
+
}
|
|
143
|
+
args.provider = name;
|
|
144
|
+
i = got.next - 1;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (a === "-") {
|
|
148
|
+
if (args.file) {
|
|
149
|
+
throw new UsageError("Pass at most one input file.");
|
|
150
|
+
}
|
|
151
|
+
args.file = "-";
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (a.startsWith("-")) {
|
|
155
|
+
throw new UsageError(`Unknown option: ${a}`);
|
|
156
|
+
}
|
|
157
|
+
if (args.file) {
|
|
158
|
+
throw new UsageError(`Unexpected extra argument: ${a}`);
|
|
159
|
+
}
|
|
160
|
+
args.file = a;
|
|
161
|
+
}
|
|
162
|
+
// Dedupe keep while preserving order.
|
|
163
|
+
const seen = new Set();
|
|
164
|
+
args.keep = args.keep.filter((k) => {
|
|
165
|
+
if (seen.has(k))
|
|
166
|
+
return false;
|
|
167
|
+
seen.add(k);
|
|
168
|
+
return true;
|
|
169
|
+
});
|
|
170
|
+
return args;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=parse-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"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"}
|