mcp-context-optimizer 0.1.4 → 0.1.6

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 CHANGED
@@ -225,12 +225,12 @@ impossible-budget C_optimizer 79 58 27%
225
225
  required facts fully retained in every scenario: YES
226
226
  budget compliance: 9/9 scenarios within budget
227
227
  attribution integrity (all source tags resolve): YES
228
- avg reduction: C=37% B=21%
229
- avg retrieval precision(C)=72% recall(C)=100%
228
+ avg reduction: C=42% B=21%
229
+ avg retrieval precision(C)=71% recall(C)=100%
230
230
  ```
231
231
 
232
232
  Candidate C retains 100% of required facts in all 9 scenarios, stays within budget, and
233
- achieves 37% average reduction (vs 21% for simple dedupe+truncation). On tight budgets
233
+ achieves 42% average reduction (vs 21% for simple dedupe+truncation). On tight budgets
234
234
  it preserves mandatory constraints while Baseline B loses them.
235
235
 
236
236
  ## Testing
@@ -248,3 +248,127 @@ similar-but-non-identical errors, required-fact preservation, source-reference
248
248
  integrity, stable ranking, empty/malformed input, impossible budgets, MCP tool
249
249
  validation, and local-only operation (no network).
250
250
 
251
+
252
+ ## Custom tokenizers
253
+
254
+ By default, token counts use the `chars/4` heuristic (deterministic, zero dependencies).
255
+ For production use with a specific model, plug in a real tokenizer:
256
+
257
+ ```ts
258
+ import { ContextOptimizer, type TokenEstimator } from 'mcp-context-optimizer';
259
+ import { encoding_for_model } from 'tiktoken'; // npm install tiktoken (optional dep)
260
+
261
+ const enc = encoding_for_model('gpt-4');
262
+ const tokenizer: TokenEstimator = {
263
+ name: 'tiktoken/gpt-4',
264
+ estimate: (text: string) => enc.encode(text).length,
265
+ };
266
+
267
+ const optimizer = new ContextOptimizer({
268
+ tokenBudget: 12_000,
269
+ tokenEstimator: tokenizer,
270
+ });
271
+ ```
272
+
273
+ The `estimate` function must be **deterministic** — the same string must always
274
+ return the same number. This keeps `buildContext` output byte-identical for
275
+ identical inputs, which is required for caching and reproducibility.
276
+
277
+ See `src/tokens.ts` for the `TokenEstimator` interface and the built-in
278
+ `defaultTokenEstimator` / `createTokenEstimator` helpers.
279
+
280
+ ## Versioning & SemVer
281
+
282
+ `mcp-context-optimizer` follows [SemVer](https://semver.org/).
283
+
284
+ | Component | Stability | Breaking change policy |
285
+ | --- | --- | --- |
286
+ | Public TypeScript API (`src/index.ts` exports) | Stable | Minor version bump |
287
+ | Rendered context text format | Stable | Minor version bump |
288
+ | `OptimizationReport` JSON shape | Stable | Minor version bump |
289
+ | `PIPELINE_VERSION` constant | Internal | Patch may change if output format changes |
290
+ | MCP tool names / arguments | Stable | Minor version bump |
291
+ | Scoring weight defaults | Internal | Patch may change (re-optimize after upgrade) |
292
+
293
+ `PIPELINE_VERSION` is incremented whenever the pipeline changes in a way that
294
+ affects output (e.g. new compaction stage, new scoring signal). It is part of
295
+ the config hash so that cached results are invalidated automatically.
296
+
297
+ Current version: `0.1.x` — pre-1.0. Breaking changes may land in minor releases
298
+ until `1.0.0`. After `1.0.0`, breaking changes require a major version bump.
299
+
300
+ ## Comparison with alternatives
301
+
302
+ | Approach | Deterministic | Local-only | Zero deps | Structured signals | Budget control | Provenance |
303
+ | --- | --- | --- | --- | --- | --- | --- |
304
+ | **mcp-context-optimizer** | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Paths/symbols/stacks/errors | ✅ Hard budget + mandatory | ✅ Every fragment tagged |
305
+ | LLM summarization (external API) | ❌ No | ❌ No | ❌ No | ⚠️ Partial | ⚠️ Soft / best-effort | ❌ None |
306
+ | Simple truncation (head/tail) | ✅ Yes | ✅ Yes | ✅ Yes | ❌ None | ✅ Yes | ❌ None |
307
+ | Semantic chunking (embeddings) | ⚠️ Model-dependent | ❌ Usually remote | ❌ Heavy deps | ❌ None | ⚠️ Soft | ❌ None |
308
+ | RAG / vector retrieval | ⚠️ Approximate | ❌ Usually remote | ❌ Heavy deps | ❌ None | ✅ Yes | ⚠️ Source docs only |
309
+
310
+ Key differences:
311
+
312
+ - **No model calls.** Most "context optimizers" are just wrappers around another
313
+ LLM that summarizes your context — expensive, slow, non-deterministic, and
314
+ sends your code to a third party. This package does everything locally with
315
+ pure functions.
316
+ - **Structured, not blind.** It extracts file paths, symbols, stack frames, test
317
+ failures, and explicit requirements before scoring, so a 200-line stack trace
318
+ is reduced to its relevant frames rather than chopped at an arbitrary line.
319
+ - **Mandatory facts are never silently dropped.** If required content exceeds
320
+ the budget, the conflict is reported (`BUDGET_CONFLICT`) instead of silently
321
+ losing evidence.
322
+ - **Full audit trail.** Every retained fragment carries a `[source: ...]` tag,
323
+ and the machine-readable report lists every merge, omission, and score
324
+ component.
325
+
326
+ ## MCP client integration examples
327
+
328
+ ### Claude Code
329
+
330
+ ```bash
331
+ claude mcp add mcp-context-optimizer -- node /absolute/path/to/dist/mcp/cli.js
332
+ ```
333
+
334
+ Then in Claude Code, the agent can call `build_context`, `search_context`,
335
+ `get_decisions`, `get_relevant_errors`, `get_file_history`, and
336
+ `ingest_records` directly.
337
+
338
+ ### Cursor / Claude Desktop (`mcp.json`)
339
+
340
+ ```json
341
+ {
342
+ "mcpServers": {
343
+ "mcp-context-optimizer": {
344
+ "command": "node",
345
+ "args": ["/absolute/path/to/mcp-context-optimizer/dist/mcp/cli.js"]
346
+ }
347
+ }
348
+ }
349
+ ```
350
+
351
+ ### Continue.dev
352
+
353
+ Add to `~/.continue/config.json`:
354
+
355
+ ```json
356
+ {
357
+ "mcpServers": {
358
+ "mcp-context-optimizer": {
359
+ "command": "node",
360
+ "args": ["/absolute/path/to/mcp-context-optimizer/dist/mcp/cli.js"]
361
+ }
362
+ }
363
+ }
364
+ ```
365
+
366
+ **Important:** MCP tool availability does not automatically intercept model
367
+ requests. The client/agent must explicitly call these tools (e.g. call
368
+ `build_context` before answering). Automatic context replacement requires a
369
+ native integration inside the coding agent.
370
+
371
+ The MCP server stores data **in memory per process lifetime** — restarting the
372
+ server starts from an empty store. Re-ingest records or implement your own
373
+ `ContextStore` (see `src/store.ts`) for persistence.
374
+
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Text compaction stage (Stage 3b).
3
+ *
4
+ * Reduces fragment text size without losing information needed for scoring,
5
+ * provenance, or task-solving. Applied AFTER extraction (so structured
6
+ * signals like stack frames and symbols are already captured) and BEFORE
7
+ * dedup (so compacted text improves similarity matching).
8
+ *
9
+ * All functions are pure and deterministic.
10
+ */
11
+ import type { Fragment } from './types.js';
12
+ export interface CompactOptions {
13
+ /** Maximum stack frames to keep per error fragment. */
14
+ maxStackFrames: number;
15
+ /** Maximum lines to keep from tool_call / test_result output. */
16
+ maxToolOutputLines: number;
17
+ /** Whether to strip blank lines and trailing whitespace from code files. */
18
+ compactCode: boolean;
19
+ /** Whether to truncate stack traces. */
20
+ compactErrors: boolean;
21
+ /** Whether to collapse verbose tool output. */
22
+ compactToolOutput: boolean;
23
+ /** Whether to trim boilerplate from conversational messages. */
24
+ compactMessages: boolean;
25
+ }
26
+ export declare const DEFAULT_COMPACT_OPTIONS: CompactOptions;
27
+ export interface CompactResult {
28
+ fragments: Fragment[];
29
+ warnings: Array<{
30
+ code: 'COMPACT_TRUNCATED';
31
+ message: string;
32
+ }>;
33
+ /** Per-fragment chars saved by compaction. */
34
+ savings: Map<string, number>;
35
+ }
36
+ /**
37
+ * Compact code text: remove blank lines and trailing whitespace.
38
+ * Safe for source files — only removes formatting whitespace that does
39
+ * not change semantics (empty lines, trailing spaces/tabs).
40
+ */
41
+ export declare function compactCode(text: string): string;
42
+ /**
43
+ * Compact a stack trace: keep the first line (error message) and the top
44
+ * N application frames. Node-internal and library frames are filtered
45
+ * so only relevant frames are retained.
46
+ */
47
+ export declare function compactStackTrace(text: string, maxFrames?: number): string;
48
+ /**
49
+ * Compact tool output: collapse trailing whitespace and truncate long
50
+ * outputs while keeping the beginning and end (summary) for context.
51
+ */
52
+ export declare function compactToolOutput(text: string, maxLines?: number): string;
53
+ /**
54
+ * Compact general conversational text: collapse runs of blank lines to
55
+ * a single blank line and trim trailing whitespace per line.
56
+ */
57
+ export declare function compactGeneralText(text: string): string;
58
+ /**
59
+ * Apply kind-specific compaction to a single fragment.
60
+ * Returns a new fragment with compacted text (or the same fragment if
61
+ * no reduction occurred). All structured signals (extracted paths,
62
+ * symbols, stack frames) are preserved unchanged.
63
+ */
64
+ export declare function compactFragment(fragment: Fragment, opts: CompactOptions): Fragment;
65
+ /**
66
+ * Stage 3b: apply text compaction to all fragments.
67
+ * Returns new fragments (does not mutate input).
68
+ */
69
+ export declare function compactStage(fragments: Fragment[], opts?: CompactOptions): CompactResult;
70
+ //# sourceMappingURL=compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.d.ts","sourceRoot":"","sources":["../src/compact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,uBAAuB,EAAE,cAOrC,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,mBAAmB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,8CAA8C;IAC9C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAMD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,MAAM,CAwB7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,CAe7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,GAAG,QAAQ,CA8ClF;AAMD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,GAAE,cAAwC,GAC7C,aAAa,CAuBf"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Text compaction stage (Stage 3b).
3
+ *
4
+ * Reduces fragment text size without losing information needed for scoring,
5
+ * provenance, or task-solving. Applied AFTER extraction (so structured
6
+ * signals like stack frames and symbols are already captured) and BEFORE
7
+ * dedup (so compacted text improves similarity matching).
8
+ *
9
+ * All functions are pure and deterministic.
10
+ */
11
+ export const DEFAULT_COMPACT_OPTIONS = {
12
+ maxStackFrames: 5,
13
+ maxToolOutputLines: 15,
14
+ compactCode: true,
15
+ compactErrors: true,
16
+ compactToolOutput: true,
17
+ compactMessages: true,
18
+ };
19
+ // ---------------------------------------------------------------------------
20
+ // Individual compaction functions
21
+ // ---------------------------------------------------------------------------
22
+ /**
23
+ * Compact code text: remove blank lines and trailing whitespace.
24
+ * Safe for source files — only removes formatting whitespace that does
25
+ * not change semantics (empty lines, trailing spaces/tabs).
26
+ */
27
+ export function compactCode(text) {
28
+ const lines = text.split('\n');
29
+ const result = lines
30
+ .map((l) => l.replace(/[ \t]+$/g, ''))
31
+ .filter((l) => l.trim().length > 0);
32
+ return result.join('\n');
33
+ }
34
+ /**
35
+ * Compact a stack trace: keep the first line (error message) and the top
36
+ * N application frames. Node-internal and library frames are filtered
37
+ * so only relevant frames are retained.
38
+ */
39
+ export function compactStackTrace(text, maxFrames = 5) {
40
+ const lines = text.split('\n');
41
+ if (lines.length <= maxFrames + 2)
42
+ return text;
43
+ const errorLine = lines[0] ?? '';
44
+ const rest = lines.slice(1);
45
+ const kept = [];
46
+ let skipped = 0;
47
+ for (const line of rest) {
48
+ if (kept.length >= maxFrames) {
49
+ skipped++;
50
+ continue;
51
+ }
52
+ if (/node:internal|node_modules|webpack:\/\//.test(line)) {
53
+ skipped++;
54
+ continue;
55
+ }
56
+ kept.push(line);
57
+ }
58
+ if (skipped === 0)
59
+ return text;
60
+ const suffix = `... (${skipped} frame(s) omitted)`;
61
+ return [errorLine, ...kept, suffix].join('\n');
62
+ }
63
+ /**
64
+ * Compact tool output: collapse trailing whitespace and truncate long
65
+ * outputs while keeping the beginning and end (summary) for context.
66
+ */
67
+ export function compactToolOutput(text, maxLines = 15) {
68
+ const lines = text.split('\n');
69
+ if (lines.length <= maxLines) {
70
+ return lines.map((l) => l.replace(/[ \t]+$/g, '')).join('\n');
71
+ }
72
+ const keepHead = Math.max(3, maxLines - 5);
73
+ const head = lines.slice(0, keepHead);
74
+ const tail = lines.slice(-5);
75
+ const omitted = lines.length - head.length - tail.length;
76
+ return [
77
+ ...head.map((l) => l.replace(/[ \t]+$/g, '')),
78
+ `... (${omitted} line(s) omitted)`,
79
+ ...tail.map((l) => l.replace(/[ \t]+$/g, '')),
80
+ ].join('\n');
81
+ }
82
+ /**
83
+ * Compact general conversational text: collapse runs of blank lines to
84
+ * a single blank line and trim trailing whitespace per line.
85
+ */
86
+ export function compactGeneralText(text) {
87
+ return text
88
+ .replace(/[ \t]+$/gm, '')
89
+ .replace(/\n{3,}/g, '\n\n')
90
+ .trim();
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Fragment-level compaction dispatcher
94
+ // ---------------------------------------------------------------------------
95
+ /**
96
+ * Apply kind-specific compaction to a single fragment.
97
+ * Returns a new fragment with compacted text (or the same fragment if
98
+ * no reduction occurred). All structured signals (extracted paths,
99
+ * symbols, stack frames) are preserved unchanged.
100
+ */
101
+ export function compactFragment(fragment, opts) {
102
+ const original = fragment.text;
103
+ let compacted;
104
+ switch (fragment.kind) {
105
+ case 'file':
106
+ compacted = opts.compactCode ? compactCode(original) : original;
107
+ break;
108
+ case 'error':
109
+ compacted = opts.compactErrors
110
+ ? compactStackTrace(original, opts.maxStackFrames)
111
+ : original;
112
+ break;
113
+ case 'tool_call':
114
+ compacted = opts.compactToolOutput
115
+ ? compactToolOutput(original, opts.maxToolOutputLines)
116
+ : original;
117
+ break;
118
+ case 'test_result':
119
+ compacted = opts.compactToolOutput
120
+ ? compactToolOutput(original, opts.maxToolOutputLines)
121
+ : compactGeneralText(original);
122
+ break;
123
+ case 'message':
124
+ case 'note':
125
+ compacted = opts.compactMessages ? compactGeneralText(original) : original;
126
+ break;
127
+ case 'diff':
128
+ compacted = compactGeneralText(original);
129
+ break;
130
+ case 'decision':
131
+ compacted = original;
132
+ break;
133
+ }
134
+ if (compacted === original)
135
+ return fragment;
136
+ return {
137
+ ...fragment,
138
+ text: compacted,
139
+ meta: { ...fragment.meta, compacted: true },
140
+ provenance: {
141
+ ...fragment.provenance,
142
+ originalLength: original.length,
143
+ },
144
+ };
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Stage entry point
148
+ // ---------------------------------------------------------------------------
149
+ /**
150
+ * Stage 3b: apply text compaction to all fragments.
151
+ * Returns new fragments (does not mutate input).
152
+ */
153
+ export function compactStage(fragments, opts = DEFAULT_COMPACT_OPTIONS) {
154
+ const warnings = [];
155
+ const savings = new Map();
156
+ const result = [];
157
+ for (const f of fragments) {
158
+ const compacted = compactFragment(f, opts);
159
+ result.push(compacted);
160
+ const saved = f.text.length - compacted.text.length;
161
+ if (saved > 0) {
162
+ savings.set(f.id, saved);
163
+ }
164
+ }
165
+ const totalSaved = [...savings.values()].reduce((a, b) => a + b, 0);
166
+ if (totalSaved > 0) {
167
+ warnings.push({
168
+ code: 'COMPACT_TRUNCATED',
169
+ message: `Text compaction saved ~${Math.ceil(totalSaved / 4)} est. tokens across ${savings.size} fragment(s).`,
170
+ });
171
+ }
172
+ return { fragments: result, warnings, savings };
173
+ }
174
+ //# sourceMappingURL=compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.js","sourceRoot":"","sources":["../src/compact.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,8 +7,9 @@
7
7
  export { ContextOptimizer, PIPELINE_VERSION } from './optimizer.js';
8
8
  export { defaultTokenEstimator, createTokenEstimator, sha256, shortHash, } from './tokens.js';
9
9
  export { DEFAULT_WEIGHTS, DECISION_RECENCY_FLOOR, tokenize, scoreStage } from './score.js';
10
- export { renderContext, sourceTag } from './render.js';
11
- export { selectStage, fragmentCost } from './select.js';
10
+ export { renderContext, sourceTag, type RenderOptions } from './render.js';
11
+ export { selectStage, fragmentCost, truncateText } from './select.js';
12
+ export { compactStage, compactFragment, compactCode, compactStackTrace, compactToolOutput, compactGeneralText, DEFAULT_COMPACT_OPTIONS, type CompactOptions, type CompactResult } from './compact.js';
12
13
  export { dedupeStage, containmentSimilarity } from './dedupe.js';
13
14
  export { extractStage, extractSignals, extractPaths, extractSymbols, extractStackFrames, extractRequirements, } from './extract.js';
14
15
  export { normalizeStage, collectRecords, recordToFragment, normalizeText, collapseRepeatedLines, stableStringify, validateRecord, } from './normalize.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,EACN,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/F,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,OAAO,EACP,WAAW,GACZ,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,EACN,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACtM,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/F,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,OAAO,EACP,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -8,7 +8,8 @@ export { ContextOptimizer, PIPELINE_VERSION } from './optimizer.js';
8
8
  export { defaultTokenEstimator, createTokenEstimator, sha256, shortHash, } from './tokens.js';
9
9
  export { DEFAULT_WEIGHTS, DECISION_RECENCY_FLOOR, tokenize, scoreStage } from './score.js';
10
10
  export { renderContext, sourceTag } from './render.js';
11
- export { selectStage, fragmentCost } from './select.js';
11
+ export { selectStage, fragmentCost, truncateText } from './select.js';
12
+ export { compactStage, compactFragment, compactCode, compactStackTrace, compactToolOutput, compactGeneralText, DEFAULT_COMPACT_OPTIONS } from './compact.js';
12
13
  export { dedupeStage, containmentSimilarity } from './dedupe.js';
13
14
  export { extractStage, extractSignals, extractPaths, extractSymbols, extractStackFrames, extractRequirements, } from './extract.js';
14
15
  export { normalizeStage, collectRecords, recordToFragment, normalizeText, collapseRepeatedLines, stableStringify, validateRecord, } from './normalize.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,EACN,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,EACN,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,SAAS,EAAsB,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAA2C,MAAM,cAAc,CAAC;AACtM,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -1,5 +1,7 @@
1
+ import { type CompactOptions } from './compact.js';
1
2
  import type { BuildContextInput, Fragment, InputRecord, OptimizerOptions, OptimizedContext, ScoringWeights, TokenEstimator } from './types.js';
2
- export declare const PIPELINE_VERSION = "1";
3
+ /** Bumped when the pipeline changes in a way that affects output. */
4
+ export declare const PIPELINE_VERSION = "1.1";
3
5
  interface ResolvedOptions {
4
6
  tokenBudget: number;
5
7
  estimator: TokenEstimator;
@@ -7,11 +9,14 @@ interface ResolvedOptions {
7
9
  recencyHalfLifeDays: number;
8
10
  nearDuplicateThreshold: number;
9
11
  maxFragments: number;
12
+ enableCompaction: boolean;
13
+ compactOptions: CompactOptions;
14
+ compactSourceTags: boolean;
10
15
  }
11
16
  /**
12
17
  * Deterministic context optimizer.
13
18
  *
14
- * Pipeline: normalize -> extract -> dedupe -> score -> select -> render.
19
+ * Pipeline: normalize -> extract -> compact -> dedupe -> score -> select -> render.
15
20
  * Identical inputs and configuration always produce identical outputs
16
21
  * (no wall-clock time, no randomness, stable tie-breaking).
17
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAEhB,cAAc,EACd,cAAc,EAEf,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,GAAE,gBAAqB;IAsB1C,+DAA+D;IAC/D,IAAI,MAAM,IAAI,QAAQ,CAAC,eAAe,CAAC,CAEtC;IAED;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIvE;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA8BrB;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;QAC/E,QAAQ,EAAE,QAAQ,CAAC;QACnB,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;KACvC,CAAC;IAoCF,mDAAmD;IACnD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB;CAiH7D"}
1
+ {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAQ1F,OAAO,KAAK,EACV,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAEhB,cAAc,EACd,cAAc,EAEf,MAAM,YAAY,CAAC;AAEpB,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,GAAE,gBAAqB;IAmC1C,+DAA+D;IAC/D,IAAI,MAAM,IAAI,QAAQ,CAAC,eAAe,CAAC,CAEtC;IAED;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIvE;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA8BrB;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;QAC/E,QAAQ,EAAE,QAAQ,CAAC;QACnB,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;KACvC,CAAC;IAwCF,mDAAmD;IACnD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB;CA6H7D"}
package/dist/optimizer.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { compactStage, DEFAULT_COMPACT_OPTIONS } from './compact.js';
1
2
  import { dedupeStage } from './dedupe.js';
2
3
  import { extractStage } from './extract.js';
3
4
  import { collectRecords, normalizeStage } from './normalize.js';
@@ -5,11 +6,12 @@ import { renderContext } from './render.js';
5
6
  import { buildScoringContext, DEFAULT_WEIGHTS, scoreStage } from './score.js';
6
7
  import { selectStage } from './select.js';
7
8
  import { defaultTokenEstimator, sha256 } from './tokens.js';
8
- export const PIPELINE_VERSION = '1';
9
+ /** Bumped when the pipeline changes in a way that affects output. */
10
+ export const PIPELINE_VERSION = '1.1';
9
11
  /**
10
12
  * Deterministic context optimizer.
11
13
  *
12
- * Pipeline: normalize -> extract -> dedupe -> score -> select -> render.
14
+ * Pipeline: normalize -> extract -> compact -> dedupe -> score -> select -> render.
13
15
  * Identical inputs and configuration always produce identical outputs
14
16
  * (no wall-clock time, no randomness, stable tie-breaking).
15
17
  */
@@ -22,8 +24,18 @@ export class ContextOptimizer {
22
24
  estimator: options.tokenEstimator ?? defaultTokenEstimator,
23
25
  weights: { ...DEFAULT_WEIGHTS, ...options.weights },
24
26
  recencyHalfLifeDays: options.recencyHalfLifeDays ?? 7,
25
- nearDuplicateThreshold: options.nearDuplicateThreshold ?? 0.92,
27
+ nearDuplicateThreshold: options.nearDuplicateThreshold ?? 0.85,
26
28
  maxFragments: options.maxFragments ?? 5000,
29
+ enableCompaction: options.enableCompaction ?? true,
30
+ compactOptions: {
31
+ maxStackFrames: options.maxStackFrames ?? DEFAULT_COMPACT_OPTIONS.maxStackFrames,
32
+ maxToolOutputLines: options.maxToolOutputLines ?? DEFAULT_COMPACT_OPTIONS.maxToolOutputLines,
33
+ compactCode: options.compactCode ?? DEFAULT_COMPACT_OPTIONS.compactCode,
34
+ compactErrors: options.compactErrors ?? DEFAULT_COMPACT_OPTIONS.compactErrors,
35
+ compactToolOutput: options.compactToolOutput ?? DEFAULT_COMPACT_OPTIONS.compactToolOutput,
36
+ compactMessages: options.compactMessages ?? DEFAULT_COMPACT_OPTIONS.compactMessages,
37
+ },
38
+ compactSourceTags: options.compactSourceTags ?? true,
27
39
  };
28
40
  this.configHash = sha256(JSON.stringify({
29
41
  v: PIPELINE_VERSION,
@@ -33,6 +45,9 @@ export class ContextOptimizer {
33
45
  recencyHalfLifeDays: this.opts.recencyHalfLifeDays,
34
46
  nearDuplicateThreshold: this.opts.nearDuplicateThreshold,
35
47
  maxFragments: this.opts.maxFragments,
48
+ enableCompaction: this.opts.enableCompaction,
49
+ compactOptions: this.opts.compactOptions,
50
+ compactSourceTags: this.opts.compactSourceTags,
36
51
  })).slice(0, 16);
37
52
  }
38
53
  /** Resolved configuration (read-only view for diagnostics). */
@@ -86,6 +101,10 @@ export class ContextOptimizer {
86
101
  const limit = input.limit ?? 10;
87
102
  const normalized = normalizeStage(input.records ?? []);
88
103
  let fragments = extractStage(normalized.fragments);
104
+ if (this.opts.enableCompaction) {
105
+ const comp = compactStage(fragments, this.opts.compactOptions);
106
+ fragments = comp.fragments;
107
+ }
89
108
  if (fragments.length > this.opts.maxFragments) {
90
109
  fragments = fragments.slice(0, this.opts.maxFragments);
91
110
  }
@@ -117,8 +136,14 @@ export class ContextOptimizer {
117
136
  const rawRecords = collectRecords(input);
118
137
  const normalized = normalizeStage(rawRecords);
119
138
  warnings.push(...normalized.warnings);
120
- // Extraction (before dedup so dedupe can rely on signals if needed).
139
+ // Stage 2: extraction.
121
140
  let fragments = extractStage(normalized.fragments);
141
+ // Stage 3: text compaction (after extraction so signals are preserved).
142
+ if (this.opts.enableCompaction) {
143
+ const comp = compactStage(fragments, this.opts.compactOptions);
144
+ fragments = comp.fragments;
145
+ warnings.push(...comp.warnings);
146
+ }
122
147
  // Deterministic fragment cap.
123
148
  if (fragments.length > this.opts.maxFragments) {
124
149
  fragments = fragments.slice(0, this.opts.maxFragments);
@@ -163,7 +188,9 @@ export class ContextOptimizer {
163
188
  });
164
189
  warnings.push(...selection.warnings);
165
190
  // Stage 6: render + report.
166
- const context = renderContext(input.task, selection.selected);
191
+ const context = renderContext(input.task, selection.selected, {
192
+ compactSourceTags: this.opts.compactSourceTags,
193
+ });
167
194
  const estimatedOutput = this.opts.estimator.estimate(context);
168
195
  const estimatedInput = this.opts.estimator.estimate(normalized.records.map((r) => JSON.stringify(r)).join('\n'));
169
196
  const reductionRatio = estimatedInput > 0 ? (estimatedInput - estimatedOutput) / estimatedInput : 0;
@@ -172,6 +199,9 @@ export class ContextOptimizer {
172
199
  recordsIn: normalized.records.length,
173
200
  fragmentsAfterExtraction: normalized.fragments.length,
174
201
  fragmentsAfterDedup: deduped.fragments.length,
202
+ fragmentsAfterCompaction: this.opts.enableCompaction
203
+ ? fragments.length
204
+ : normalized.fragments.length,
175
205
  fragmentsSelected: selection.selected.length,
176
206
  fragmentsOmitted: selection.omitted.length,
177
207
  },
@@ -1 +1 @@
1
- {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAa5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAWpC;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;IACV,IAAI,CAAkB;IACtB,UAAU,CAAS;IAEpC,YAAY,UAA4B,EAAE;QACxC,IAAI,CAAC,IAAI,GAAG;YACV,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM;YAC1C,SAAS,EAAE,OAAO,CAAC,cAAc,IAAI,qBAAqB;YAC1D,OAAO,EAAE,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;YACnD,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,IAAI,CAAC;YACrD,sBAAsB,EAAE,OAAO,CAAC,sBAAsB,IAAI,IAAI;YAC9D,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;SAC3C,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,MAAM,CACtB,IAAI,CAAC,SAAS,CAAC;YACb,CAAC,EAAE,gBAAgB;YACnB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;YAClC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;YACnC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;YAC1B,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAClD,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB;YACxD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;SACrC,CAAC,CACH,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,+DAA+D;IAC/D,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,KAAwB;QACzC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACK,aAAa,CAAC,SAAqB,EAAE,IAAY,EAAE,KAAa;QACtE,MAAM,GAAG,GAAG,mBAAmB,CAC7B,SAAS,EACT,IAAI,EACJ,KAAK,IAAI,SAAS,EAClB,SAAS,EACT,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAClB,CAAC;QACF,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC;QAC3C,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACzB,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,cAAc,KAAK,UAAU;gBAAE,SAAS,GAAG,IAAI,CAAC;YACrF,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACjE,qEAAqE;gBACrE,+DAA+D;gBAC/D,MAAM,kBAAkB,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5E,IAAI,kBAAkB;oBAAE,SAAS,GAAG,IAAI,CAAC;YAC3C,CAAC;YACD,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/E,MAAM,WAAW,GACf,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAChD,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACpD,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/D,IAAI,WAAW;oBAAE,SAAS,GAAG,IAAI,CAAC;YACpC,CAAC;YACD,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAiE;QAItE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE;YACrC,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB;SACzD,CAAC,CAAC;QACH,IAAI,YAAgC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,CAAC,SAAS;gBAAE,SAAS;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,GAAG,YAAY,CAAC;gBAAE,YAAY,GAAG,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,GAAG,GAAG,mBAAmB,CAC7B,OAAO,CAAC,SAAS,EACjB,KAAK,CAAC,KAAK,EACX,SAAS,EACT,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAClB,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,MAAM,CAAC;aACf,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC;YAC7C,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;YAC7B,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACzB;aACA,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAuC,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,mDAAmD;IACnD,gBAAgB,CAAC,KAAwB;QACvC,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QAE1D,iCAAiC;QACjC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEtC,qEAAqE;QACrE,IAAI,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEnD,8BAA8B;QAC9B,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,4BAA4B,IAAI,CAAC,IAAI,CAAC,YAAY,iDAAiD;aAC7G,CAAC,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE;YACrC,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB;SACzD,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnC,8DAA8D;QAC9D,IAAI,YAAgC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,CAAC,SAAS;gBAAE,SAAS;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,GAAG,YAAY,CAAC;gBAAE,YAAY,GAAG,CAAC,CAAC;QAC7F,CAAC;QAED,yEAAyE;QACzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE/E,8BAA8B;QAC9B,MAAM,UAAU,GAAG,mBAAmB,CACpC,aAAa,EACb,KAAK,CAAC,IAAI,EACV,KAAK,IAAI,SAAS,EAClB,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAClB,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAErD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,yBAAyB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,sGAAsG;aACjK,CAAC,CAAC;QACL,CAAC;QAED,mCAAmC;QACnC,MAAM,UAAU,GAAG,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE;YACpC,UAAU;YACV,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;SAC/B,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAErC,4BAA4B;QAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CACjD,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5D,CAAC;QACF,MAAM,cAAc,GAClB,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,eAAe,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/E,MAAM,MAAM,GAAuB;YACjC,MAAM,EAAE;gBACN,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;gBACpC,wBAAwB,EAAE,UAAU,CAAC,SAAS,CAAC,MAAM;gBACrD,mBAAmB,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM;gBAC7C,iBAAiB,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;gBAC5C,gBAAgB,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM;aAC3C;YACD,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;gBACnC,cAAc;gBACd,eAAe;gBACf,cAAc;aACf;YACD,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD,CAAC,CAAC;YACH,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;QAEF,OAAO;YACL,OAAO;YACP,OAAO,EAAE,SAAS,CAAC,QAAQ;YAC3B,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,MAAM;YACN,KAAK,EAAE;gBACL,oBAAoB,EAAE,cAAc;gBACpC,qBAAqB,EAAE,eAAe;gBACtC,cAAc;aACf;SACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"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"}
package/dist/render.d.ts CHANGED
@@ -1,10 +1,29 @@
1
1
  import type { Fragment, SelectedFragment } from './types.js';
2
- /** Compact source tag kept with every rendered fragment. */
3
- export declare function sourceTag(f: Fragment): string;
2
+ /** Default options for source tags. */
3
+ export interface SourceTagOptions {
4
+ /** When true, emit a compact tag with just the fragment id. */
5
+ compact: boolean;
6
+ }
7
+ /**
8
+ * Compact source tag kept with every rendered fragment.
9
+ *
10
+ * Full format: `[source: fr_xxx | r0 | src/path.ts | +N]`
11
+ * Compact format: `[source: fr_xxx]` (just the id; provenance in report)
12
+ *
13
+ * The full format includes the record id, file path (when available), and
14
+ * merged count so the tag is self-describing inline. The compact format
15
+ * minimises per-fragment overhead when budget is tight.
16
+ */
17
+ export declare function sourceTag(f: Fragment, opts?: Partial<SourceTagOptions>): string;
18
+ /** Rendering options. */
19
+ export interface RenderOptions {
20
+ /** Use compact source tags (shorter provenance markers). */
21
+ compactSourceTags?: boolean;
22
+ }
4
23
  /**
5
24
  * Stage 6: render the selected fragments into the compact context text.
6
25
  * Sections appear in a fixed order; fragments inside sections follow input
7
26
  * order. The task is rendered as the header and is always present.
8
27
  */
9
- export declare function renderContext(task: string, selected: SelectedFragment[]): string;
28
+ export declare function renderContext(task: string, selected: SelectedFragment[], opts?: RenderOptions): string;
10
29
  //# sourceMappingURL=render.d.ts.map