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 +127 -3
- package/dist/compact.d.ts +70 -0
- package/dist/compact.d.ts.map +1 -0
- package/dist/compact.js +174 -0
- package/dist/compact.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/optimizer.d.ts +7 -2
- package/dist/optimizer.d.ts.map +1 -1
- package/dist/optimizer.js +35 -5
- package/dist/optimizer.js.map +1 -1
- package/dist/render.d.ts +22 -3
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +21 -7
- package/dist/render.js.map +1 -1
- package/dist/score.d.ts +5 -0
- package/dist/score.d.ts.map +1 -1
- package/dist/score.js +13 -5
- package/dist/score.js.map +1 -1
- package/dist/select.d.ts +9 -0
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +103 -1
- package/dist/select.js.map +1 -1
- package/dist/types.d.ts +32 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/skills/pro/bench/token-comparison.json +69 -0
- package/skills/pro/bench/token-savings.svg +67 -0
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=
|
|
229
|
-
avg retrieval precision(C)=
|
|
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
|
|
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"}
|
package/dist/compact.js
ADDED
|
@@ -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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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"}
|
package/dist/optimizer.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
*/
|
package/dist/optimizer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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.
|
|
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
|
-
//
|
|
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
|
},
|
package/dist/optimizer.js.map
CHANGED
|
@@ -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,
|
|
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
|
-
/**
|
|
3
|
-
export
|
|
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
|