@webywz/context-diet 0.0.0-stage → 0.1.1

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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +170 -2
  3. package/dist/blocks.d.ts +8 -0
  4. package/dist/blocks.d.ts.map +1 -0
  5. package/dist/blocks.js +129 -0
  6. package/dist/blocks.js.map +1 -0
  7. package/dist/cli.d.ts +12 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +149 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/diet.d.ts +12 -0
  12. package/dist/diet.d.ts.map +1 -0
  13. package/dist/diet.js +66 -0
  14. package/dist/diet.js.map +1 -0
  15. package/dist/heuristics.d.ts +13 -0
  16. package/dist/heuristics.d.ts.map +1 -0
  17. package/dist/heuristics.js +238 -0
  18. package/dist/heuristics.js.map +1 -0
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/llm.d.ts +12 -0
  24. package/dist/llm.d.ts.map +1 -0
  25. package/dist/llm.js +107 -0
  26. package/dist/llm.js.map +1 -0
  27. package/dist/package-info.d.ts +5 -0
  28. package/dist/package-info.d.ts.map +1 -0
  29. package/dist/package-info.js +13 -0
  30. package/dist/package-info.js.map +1 -0
  31. package/dist/parse-args.d.ts +19 -0
  32. package/dist/parse-args.d.ts.map +1 -0
  33. package/dist/parse-args.js +172 -0
  34. package/dist/parse-args.js.map +1 -0
  35. package/dist/report.d.ts +24 -0
  36. package/dist/report.d.ts.map +1 -0
  37. package/dist/report.js +56 -0
  38. package/dist/report.js.map +1 -0
  39. package/dist/tokens.d.ts +6 -0
  40. package/dist/tokens.d.ts.map +1 -0
  41. package/dist/tokens.js +73 -0
  42. package/dist/tokens.js.map +1 -0
  43. package/dist/truncate.d.ts +4 -0
  44. package/dist/truncate.d.ts.map +1 -0
  45. package/dist/truncate.js +136 -0
  46. package/dist/truncate.js.map +1 -0
  47. package/dist/types.d.ts +48 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +18 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +58 -4
@@ -0,0 +1,24 @@
1
+ import type { CutCounts, DietResult } from "./types.js";
2
+ export interface JsonReport {
3
+ ok: true;
4
+ source: string;
5
+ input: {
6
+ chars: number;
7
+ tokens: number;
8
+ };
9
+ output: {
10
+ chars: number;
11
+ tokens: number;
12
+ };
13
+ saved: {
14
+ chars: number;
15
+ tokens: number;
16
+ charPercent: number;
17
+ tokenPercent: number;
18
+ };
19
+ cuts: CutCounts;
20
+ text: string;
21
+ }
22
+ export declare function toJsonReport(result: DietResult, source: string): JsonReport;
23
+ export declare function formatHumanReport(result: DietResult, source: string, version: string): string;
24
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAWD,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAiB3E;AAmBD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,MAAM,CAcR"}
package/dist/report.js ADDED
@@ -0,0 +1,56 @@
1
+ function pct(before, after) {
2
+ if (before <= 0)
3
+ return 0;
4
+ return Math.round(((before - after) / before) * 1000) / 10;
5
+ }
6
+ function commas(n) {
7
+ return n.toLocaleString("en-US");
8
+ }
9
+ export function toJsonReport(result, source) {
10
+ const savedChars = Math.max(0, result.input.chars - result.output.chars);
11
+ const savedTokens = Math.max(0, result.input.tokens - result.output.tokens);
12
+ return {
13
+ ok: true,
14
+ source,
15
+ input: result.input,
16
+ output: result.output,
17
+ saved: {
18
+ chars: savedChars,
19
+ tokens: savedTokens,
20
+ charPercent: pct(result.input.chars, result.output.chars),
21
+ tokenPercent: pct(result.input.tokens, result.output.tokens),
22
+ },
23
+ cuts: result.cuts,
24
+ text: result.text,
25
+ };
26
+ }
27
+ function cutLines(cuts) {
28
+ const rows = [
29
+ ["ansi sequences", String(cuts.ansiSequences)],
30
+ ["boilerplate lines", String(cuts.boilerplateLines)],
31
+ ["duplicate paragraphs", String(cuts.duplicateParagraphs)],
32
+ ["whitespace runs", String(cuts.whitespaceRuns)],
33
+ ["omitted heavy blobs", String(cuts.omittedHeavyBlobs)],
34
+ ["truncated blocks", String(cuts.truncatedBlocks)],
35
+ ["truncated tokens", `~${commas(cuts.truncatedTokens)}`],
36
+ ["llm deepen", cuts.deepened ? "yes" : "no"],
37
+ ];
38
+ const width = Math.max(...rows.map(([k]) => k.length));
39
+ return rows.map(([k, v]) => ` ${k.padEnd(width)} ${v}`);
40
+ }
41
+ export function formatHumanReport(result, source, version) {
42
+ const { input, output } = result;
43
+ const charPct = pct(input.chars, output.chars);
44
+ const tokPct = pct(input.tokens, output.tokens);
45
+ const sign = (n) => (n > 0 ? `−${n}%` : n < 0 ? `+${Math.abs(n)}%` : "0%");
46
+ const lines = [
47
+ `context-diet ${version}`,
48
+ `source: ${source}`,
49
+ `chars: ${commas(input.chars)} → ${commas(output.chars)} (${sign(charPct)})`,
50
+ `tokens: ~${commas(input.tokens)} → ~${commas(output.tokens)} (${sign(tokPct)})`,
51
+ `cut:`,
52
+ ...cutLines(result.cuts),
53
+ ];
54
+ return lines.join("\n") + "\n";
55
+ }
56
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function estimateTokens(text: string): number;
2
+ export declare function snapshot(text: string): {
3
+ chars: number;
4
+ tokens: number;
5
+ };
6
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AA4BA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoDnD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAExE"}
package/dist/tokens.js ADDED
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Approximate a cl100k_base (GPT-4 family) token count without shipping a BPE
3
+ * table. Tuned for English prose, source code, and CJK. Typical error vs
4
+ * tiktoken is within ~20% on mixed technical text — enough to budget a prompt,
5
+ * not enough to bill on.
6
+ */
7
+ const CJK_CODE_POINT = (code) => (code >= 0x4e00 && code <= 0x9fff) ||
8
+ (code >= 0x3400 && code <= 0x4dbf) ||
9
+ (code >= 0xf900 && code <= 0xfaff) ||
10
+ (code >= 0x3040 && code <= 0x30ff) ||
11
+ (code >= 0x31f0 && code <= 0x31ff) ||
12
+ (code >= 0xac00 && code <= 0xd7af) ||
13
+ (code >= 0x1100 && code <= 0x11ff);
14
+ function isLetter(ch) {
15
+ const code = ch.charCodeAt(0);
16
+ return ((code >= 65 && code <= 90) ||
17
+ (code >= 97 && code <= 122) ||
18
+ (code >= 0xc0 && code <= 0x24f && ch.toLowerCase() !== ch.toUpperCase()));
19
+ }
20
+ function isDigit(ch) {
21
+ return ch >= "0" && ch <= "9";
22
+ }
23
+ export function estimateTokens(text) {
24
+ if (!text)
25
+ return 0;
26
+ let tokens = 0;
27
+ let i = 0;
28
+ const len = text.length;
29
+ while (i < len) {
30
+ const ch = text[i];
31
+ const code = text.charCodeAt(i);
32
+ if (ch === " " || ch === "\t" || ch === "\r") {
33
+ i++;
34
+ continue;
35
+ }
36
+ if (ch === "\n") {
37
+ tokens += 0.25;
38
+ i++;
39
+ continue;
40
+ }
41
+ if (CJK_CODE_POINT(code)) {
42
+ tokens += 1;
43
+ i++;
44
+ continue;
45
+ }
46
+ if (isLetter(ch)) {
47
+ let j = i + 1;
48
+ while (j < len && isLetter(text[j]))
49
+ j++;
50
+ const wordLen = j - i;
51
+ // Short function words / identifiers are usually 1 piece; longer words
52
+ // split roughly every 4 characters, matching cl100k's byte-pair grain.
53
+ tokens += wordLen <= 5 ? 1 : Math.ceil(wordLen / 4);
54
+ i = j;
55
+ continue;
56
+ }
57
+ if (isDigit(ch)) {
58
+ let j = i + 1;
59
+ while (j < len && isDigit(text[j]))
60
+ j++;
61
+ tokens += Math.max(1, Math.ceil((j - i) / 3));
62
+ i = j;
63
+ continue;
64
+ }
65
+ tokens += 1;
66
+ i++;
67
+ }
68
+ return Math.max(text.length === 0 ? 0 : 1, Math.round(tokens));
69
+ }
70
+ export function snapshot(text) {
71
+ return { chars: text.length, tokens: estimateTokens(text) };
72
+ }
73
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Block } from "./blocks.js";
2
+ import type { CutCounts, KeepCategory } from "./types.js";
3
+ export declare function truncateToBudget(blocks: Block[], maxTokens: number, keep: KeepCategory[], cuts: CutCounts): Block[];
4
+ //# sourceMappingURL=truncate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0D1D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,EAAE,EACpB,IAAI,EAAE,SAAS,GACd,KAAK,EAAE,CA4ET"}
@@ -0,0 +1,136 @@
1
+ import { joinBlocks } from "./blocks.js";
2
+ import { estimateTokens } from "./tokens.js";
3
+ function scoreBlock(block, keep) {
4
+ let score = 1;
5
+ switch (block.type) {
6
+ case "heading":
7
+ score = 4;
8
+ if (keep.has("headings"))
9
+ score += 24;
10
+ break;
11
+ case "code":
12
+ score = 4;
13
+ if (keep.has("code"))
14
+ score += 24;
15
+ break;
16
+ case "list":
17
+ score = 3;
18
+ if (keep.has("lists"))
19
+ score += 24;
20
+ break;
21
+ case "paragraph":
22
+ score = 2;
23
+ break;
24
+ case "rule":
25
+ score = 0;
26
+ break;
27
+ case "blank":
28
+ score = 0;
29
+ break;
30
+ default:
31
+ score = 1;
32
+ }
33
+ // Prefer earlier context when scores tie.
34
+ return score;
35
+ }
36
+ function trimBlockToTokens(raw, maxTokens) {
37
+ if (estimateTokens(raw) <= maxTokens)
38
+ return raw;
39
+ const lines = raw.split("\n");
40
+ if (lines.length > 1) {
41
+ const kept = [];
42
+ for (const line of lines) {
43
+ const trial = [...kept, line].join("\n");
44
+ if (estimateTokens(trial + "\n…") > maxTokens)
45
+ break;
46
+ kept.push(line);
47
+ }
48
+ if (kept.length > 0)
49
+ return `${kept.join("\n")}\n…`;
50
+ }
51
+ // Character walk as a last resort.
52
+ let lo = 0;
53
+ let hi = raw.length;
54
+ while (lo < hi) {
55
+ const mid = Math.ceil((lo + hi) / 2);
56
+ const slice = `${raw.slice(0, mid).trimEnd()}\n…`;
57
+ if (estimateTokens(slice) <= maxTokens)
58
+ lo = mid;
59
+ else
60
+ hi = mid - 1;
61
+ }
62
+ const cut = raw.slice(0, lo).trimEnd();
63
+ return cut.length === 0 ? "…" : `${cut}\n…`;
64
+ }
65
+ export function truncateToBudget(blocks, maxTokens, keep, cuts) {
66
+ if (!(maxTokens > 0))
67
+ return blocks;
68
+ const keepSet = new Set(keep);
69
+ const tokens = blocks.map((b) => estimateTokens(b.raw));
70
+ let total = tokens.reduce((a, b) => a + b, 0);
71
+ if (total <= maxTokens)
72
+ return blocks;
73
+ const scores = blocks.map((b) => scoreBlock(b, keepSet));
74
+ const order = blocks
75
+ .map((_, i) => i)
76
+ .sort((a, b) => {
77
+ const ds = scores[a] - scores[b];
78
+ if (ds !== 0)
79
+ return ds;
80
+ return b - a; // drop later ties first
81
+ });
82
+ const dropped = new Set();
83
+ for (const i of order) {
84
+ if (total <= maxTokens)
85
+ break;
86
+ const block = blocks[i];
87
+ if (block.type === "blank")
88
+ continue;
89
+ // Never drop the last remaining non-blank block; trim it instead.
90
+ const remainingNonBlank = blocks.filter((b, idx) => !dropped.has(idx) && b.type !== "blank").length;
91
+ if (remainingNonBlank <= 1)
92
+ continue;
93
+ dropped.add(i);
94
+ total -= tokens[i];
95
+ cuts.truncatedBlocks += 1;
96
+ cuts.truncatedTokens += tokens[i];
97
+ }
98
+ let next = blocks.filter((_, i) => !dropped.has(i));
99
+ next = next.filter((b, i, arr) => {
100
+ if (b.type !== "blank")
101
+ return true;
102
+ if (i === 0 || i === arr.length - 1)
103
+ return false;
104
+ return arr[i - 1]?.type !== "blank";
105
+ });
106
+ total = next.reduce((a, b) => a + estimateTokens(b.raw), 0);
107
+ if (total <= maxTokens)
108
+ return next;
109
+ // Still over: trim the lowest-score, largest remaining block from the end.
110
+ const trimOrder = next
111
+ .map((b, i) => ({ i, b, s: scoreBlock(b, keepSet), t: estimateTokens(b.raw) }))
112
+ .filter((x) => x.b.type !== "blank")
113
+ .sort((a, b) => a.s - b.s || b.t - a.t || b.i - a.i);
114
+ for (const item of trimOrder) {
115
+ total = next.reduce((a, b) => a + estimateTokens(b.raw), 0);
116
+ if (total <= maxTokens)
117
+ break;
118
+ const others = total - item.t;
119
+ const budget = Math.max(8, maxTokens - others);
120
+ const trimmed = trimBlockToTokens(item.b.raw, budget);
121
+ if (trimmed !== item.b.raw) {
122
+ cuts.truncatedBlocks += 1;
123
+ cuts.truncatedTokens += Math.max(0, item.t - estimateTokens(trimmed));
124
+ next = next.map((b, i) => i === item.i ? { ...b, raw: trimmed } : b);
125
+ }
126
+ }
127
+ const joined = joinBlocks(next);
128
+ if (estimateTokens(joined) <= maxTokens)
129
+ return next;
130
+ // Absolute fallback: hard-cut the joined document.
131
+ const hard = trimBlockToTokens(joined, maxTokens);
132
+ cuts.truncatedBlocks += 1;
133
+ cuts.truncatedTokens += Math.max(0, estimateTokens(joined) - estimateTokens(hard));
134
+ return [{ type: "paragraph", raw: hard }];
135
+ }
136
+ //# sourceMappingURL=truncate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export type KeepCategory = "headings" | "code" | "lists";
2
+ export type LlmProvider = "openai" | "anthropic";
3
+ export interface CutCounts {
4
+ /** ANSI escape sequences removed. */
5
+ ansiSequences: number;
6
+ /** Repeated / chrome lines dropped (logs, banners, signatures). */
7
+ boilerplateLines: number;
8
+ /** Near-identical paragraphs dropped. */
9
+ duplicateParagraphs: number;
10
+ /** Extra blank-line runs or trailing spaces collapsed. */
11
+ whitespaceRuns: number;
12
+ /** Long base64 / data-URI blobs replaced with placeholders. */
13
+ omittedHeavyBlobs: number;
14
+ /** Blocks dropped or trimmed to fit `--max-tokens`. */
15
+ truncatedBlocks: number;
16
+ /** Estimated tokens removed by truncation (not other steps). */
17
+ truncatedTokens: number;
18
+ /** True when an optional LLM pass rewrote the text. */
19
+ deepened: boolean;
20
+ }
21
+ export interface DietOptions {
22
+ /** Soft cap on estimated output tokens. */
23
+ maxTokens?: number;
24
+ /** Prefer these block types when truncating to a token budget. */
25
+ keep?: KeepCategory[];
26
+ /**
27
+ * Optional second-pass compression via OpenAI or Anthropic.
28
+ * Requires a key in the environment; never implied.
29
+ */
30
+ deepen?: boolean;
31
+ provider?: LlmProvider;
32
+ /** Injected fetch (tests). Defaults to global fetch. */
33
+ fetch?: typeof fetch;
34
+ env?: NodeJS.ProcessEnv;
35
+ }
36
+ export interface SizeSnapshot {
37
+ chars: number;
38
+ tokens: number;
39
+ }
40
+ export interface DietResult {
41
+ text: string;
42
+ input: SizeSnapshot;
43
+ output: SizeSnapshot;
44
+ cuts: CutCounts;
45
+ }
46
+ export declare const KEEP_CATEGORIES: readonly KeepCategory[];
47
+ export declare function emptyCuts(): CutCounts;
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAIlD,CAAC;AAEF,wBAAgB,SAAS,IAAI,SAAS,CAWrC"}
package/dist/types.js ADDED
@@ -0,0 +1,18 @@
1
+ export const KEEP_CATEGORIES = [
2
+ "headings",
3
+ "code",
4
+ "lists",
5
+ ];
6
+ export function emptyCuts() {
7
+ return {
8
+ ansiSequences: 0,
9
+ boilerplateLines: 0,
10
+ duplicateParagraphs: 0,
11
+ whitespaceRuns: 0,
12
+ omittedHeavyBlobs: 0,
13
+ truncatedBlocks: 0,
14
+ truncatedTokens: 0,
15
+ deepened: false,
16
+ };
17
+ }
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmDA,MAAM,CAAC,MAAM,eAAe,GAA4B;IACtD,UAAU;IACV,MAAM;IACN,OAAO;CACR,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,gBAAgB,EAAE,CAAC;QACnB,mBAAmB,EAAE,CAAC;QACtB,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,CAAC;QACpB,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;QAClB,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@webywz/context-diet",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "Slim LLM context before you send it — drop noise, keep the signal, estimate tokens.",
5
+ "keywords": [
6
+ "llm",
7
+ "context",
8
+ "tokens",
9
+ "prompt",
10
+ "cli",
11
+ "openai",
12
+ "anthropic",
13
+ "tiktoken"
14
+ ],
15
+ "homepage": "https://github.com/webywz/context-diet#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/webywz/context-diet/issues"
18
+ },
19
+ "license": "MIT",
20
+ "author": "webywz",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/webywz/context-diet.git"
24
+ },
25
+ "type": "module",
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.js"
32
+ }
33
+ },
34
+ "bin": {
35
+ "context-diet": "dist/cli.js"
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "LICENSE",
40
+ "README.md"
41
+ ],
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "scripts": {
49
+ "build": "tsc",
50
+ "test": "tsx --test test/*.test.ts",
51
+ "typecheck": "tsc --noEmit",
52
+ "dev": "tsx src/cli.ts",
53
+ "prepublishOnly": "npm test && npm run build && node -e \"require('fs').chmodSync('dist/cli.js',0o755)\""
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^22.15.29",
57
+ "tsx": "^4.23.15",
58
+ "typescript": "^5.8.3"
59
+ }
60
+ }