prompt-optimize 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +128 -0
  2. package/dist/__tests__/optimize.test.d.ts +2 -0
  3. package/dist/__tests__/optimize.test.d.ts.map +1 -0
  4. package/dist/__tests__/optimize.test.js +203 -0
  5. package/dist/__tests__/optimize.test.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +9 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/optimizer.d.ts +5 -0
  11. package/dist/optimizer.d.ts.map +1 -0
  12. package/dist/optimizer.js +133 -0
  13. package/dist/optimizer.js.map +1 -0
  14. package/dist/passes/comment-strip.d.ts +7 -0
  15. package/dist/passes/comment-strip.d.ts.map +1 -0
  16. package/dist/passes/comment-strip.js +23 -0
  17. package/dist/passes/comment-strip.js.map +1 -0
  18. package/dist/passes/empty-lines.d.ts +7 -0
  19. package/dist/passes/empty-lines.d.ts.map +1 -0
  20. package/dist/passes/empty-lines.js +20 -0
  21. package/dist/passes/empty-lines.js.map +1 -0
  22. package/dist/passes/filler-words.d.ts +7 -0
  23. package/dist/passes/filler-words.d.ts.map +1 -0
  24. package/dist/passes/filler-words.js +35 -0
  25. package/dist/passes/filler-words.js.map +1 -0
  26. package/dist/passes/preamble-strip.d.ts +7 -0
  27. package/dist/passes/preamble-strip.d.ts.map +1 -0
  28. package/dist/passes/preamble-strip.js +30 -0
  29. package/dist/passes/preamble-strip.js.map +1 -0
  30. package/dist/passes/redundancy-merge.d.ts +7 -0
  31. package/dist/passes/redundancy-merge.d.ts.map +1 -0
  32. package/dist/passes/redundancy-merge.js +71 -0
  33. package/dist/passes/redundancy-merge.js.map +1 -0
  34. package/dist/passes/trailing-spaces.d.ts +7 -0
  35. package/dist/passes/trailing-spaces.d.ts.map +1 -0
  36. package/dist/passes/trailing-spaces.js +14 -0
  37. package/dist/passes/trailing-spaces.js.map +1 -0
  38. package/dist/passes/verbose-phrases.d.ts +7 -0
  39. package/dist/passes/verbose-phrases.d.ts.map +1 -0
  40. package/dist/passes/verbose-phrases.js +39 -0
  41. package/dist/passes/verbose-phrases.js.map +1 -0
  42. package/dist/passes/whitespace-normalize.d.ts +7 -0
  43. package/dist/passes/whitespace-normalize.d.ts.map +1 -0
  44. package/dist/passes/whitespace-normalize.js +22 -0
  45. package/dist/passes/whitespace-normalize.js.map +1 -0
  46. package/dist/protect.d.ts +9 -0
  47. package/dist/protect.d.ts.map +1 -0
  48. package/dist/protect.js +105 -0
  49. package/dist/protect.js.map +1 -0
  50. package/dist/types.d.ts +48 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +3 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +39 -0
package/README.md ADDED
@@ -0,0 +1,128 @@
1
+ # prompt-optimize
2
+
3
+ Compress prompts to use fewer tokens via deterministic, rule-based heuristics. No network calls, no models — pure text transformation.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install prompt-optimize
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ ```typescript
14
+ import { optimize, analyze, createOptimizer } from 'prompt-optimize'
15
+
16
+ // Optimize with default safety level (moderate)
17
+ const result = optimize('Please just provide the answer in order to complete the task.')
18
+ console.log(result.optimized)
19
+ // => "provide the answer to complete the task."
20
+
21
+ console.log(result.report.savings)
22
+ // { tokensBefore: 14, tokensAfter: 9, tokensSaved: 5, percentage: 35.7, ... }
23
+ ```
24
+
25
+ ## API
26
+
27
+ ### `optimize(input, options?): OptimizationResult`
28
+
29
+ Run all applicable passes on `input` and return the optimized string plus a detailed report.
30
+
31
+ ```typescript
32
+ const result = optimize(prompt, { safety: 'moderate' })
33
+ // result.optimized — the compressed prompt
34
+ // result.original — unchanged original
35
+ // result.report — full OptimizationReport
36
+ ```
37
+
38
+ ### `analyze(input, options?): OptimizationReport`
39
+
40
+ Same as `optimize()` but returns only the report (without reconstructing the result object wrapper).
41
+
42
+ ### `createOptimizer(options): Optimizer`
43
+
44
+ Create a reusable optimizer bound to a fixed set of options.
45
+
46
+ ```typescript
47
+ const optimizer = createOptimizer({ safety: 'safe' })
48
+ const result = optimizer.optimize(prompt)
49
+ const report = optimizer.analyze(prompt)
50
+ ```
51
+
52
+ ## Options
53
+
54
+ | Option | Type | Default | Description |
55
+ |---|---|---|---|
56
+ | `safety` | `'safe' \| 'moderate' \| 'aggressive'` | `'moderate'` | Controls which passes run (see below) |
57
+ | `tokenCounter` | `(text: string) => number` | `len / 4` | Custom token counting function |
58
+
59
+ ## Safety levels
60
+
61
+ | Level | Passes included | Notes |
62
+ |---|---|---|
63
+ | `safe` | trailing-spaces, empty-lines, whitespace-normalize, comment-strip | Purely structural — safe for all prompts |
64
+ | `moderate` | safe + filler-words, verbose-phrases, preamble-strip, redundancy-merge | Removes words and phrases — review output |
65
+ | `aggressive` | moderate + future passes | Reserved for future high-aggression passes |
66
+
67
+ ## Passes
68
+
69
+ ### Safe passes
70
+
71
+ | ID | Name | What it does |
72
+ |---|---|---|
73
+ | `trailing-spaces` | Trailing Spaces | Removes trailing spaces and tabs from each line |
74
+ | `empty-lines` | Empty Lines | Collapses 4+ empty lines to 2; trims leading/trailing blank lines |
75
+ | `whitespace-normalize` | Whitespace Normalize | Normalizes line endings, collapses 3+ blank lines, collapses mid-line double spaces |
76
+ | `comment-strip` | Comment Strip | Removes HTML comments (`<!-- -->`), line-leading `//` comments, and line-leading `#` comments |
77
+
78
+ ### Moderate passes
79
+
80
+ | ID | Name | What it does |
81
+ |---|---|---|
82
+ | `filler-words` | Filler Words | Removes standalone filler words: please, kindly, just, simply, basically, actually, certainly, of course, obviously, you know |
83
+ | `verbose-phrases` | Verbose Phrases | Replaces wordy phrases with concise equivalents (e.g. "in order to" → "to") |
84
+ | `preamble-strip` | Preamble Strip | Strips common AI preamble openers (e.g. "Certainly! Here is...", "I'd be happy to...") |
85
+ | `redundancy-merge` | Redundancy Merge | Removes near-duplicate sentences (Jaccard similarity > 0.85) |
86
+
87
+ ## Protected regions
88
+
89
+ The following regions are never modified by any pass:
90
+
91
+ - Triple-backtick fenced code blocks (` ``` ... ``` `)
92
+ - Inline code (`` `...` ``)
93
+ - Template variables: `{{var}}`, `{var}`, `${var}`, `%(var)s`
94
+ - URLs (`https?://...`)
95
+ - Quoted strings (`"..."`, `'...'`)
96
+ - HTML tags (`<tag ...>`)
97
+ - Sentences containing negation words (not, never, don't, must not, do not, cannot, shouldn't, won't, no)
98
+
99
+ ## OptimizationResult
100
+
101
+ ```typescript
102
+ interface OptimizationResult {
103
+ optimized: string // the compressed prompt
104
+ original: string // the original, unchanged
105
+ report: OptimizationReport
106
+ }
107
+
108
+ interface OptimizationReport {
109
+ timestamp: string // ISO 8601
110
+ durationMs: number
111
+ safetyLevel: SafetyLevel
112
+ savings: TokenSavings
113
+ passes: PassResult[]
114
+ }
115
+
116
+ interface TokenSavings {
117
+ charactersBefore: number
118
+ charactersAfter: number
119
+ tokensBefore: number
120
+ tokensAfter: number
121
+ tokensSaved: number
122
+ percentage: number // 0–100
123
+ }
124
+ ```
125
+
126
+ ## License
127
+
128
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=optimize.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/optimize.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const optimizer_1 = require("../optimizer");
5
+ // ── Filler word removal ──────────────────────────────────────────────────────
6
+ (0, vitest_1.describe)('filler-words pass', () => {
7
+ (0, vitest_1.it)('removes "please" from a prompt', () => {
8
+ const result = (0, optimizer_1.optimize)('Please provide the answer.', { safety: 'moderate' });
9
+ (0, vitest_1.expect)(result.optimized.toLowerCase()).not.toContain('please');
10
+ (0, vitest_1.expect)(result.optimized).toContain('provide the answer');
11
+ });
12
+ (0, vitest_1.it)('removes "just" from a prompt', () => {
13
+ const result = (0, optimizer_1.optimize)('Just provide the answer.', { safety: 'moderate' });
14
+ (0, vitest_1.expect)(result.optimized.toLowerCase()).not.toContain('just ');
15
+ (0, vitest_1.expect)(result.optimized).toContain('provide the answer');
16
+ });
17
+ (0, vitest_1.it)('removes multiple filler words: "Please just provide the answer"', () => {
18
+ const result = (0, optimizer_1.optimize)('Please just provide the answer.', { safety: 'moderate' });
19
+ (0, vitest_1.expect)(result.optimized.toLowerCase()).not.toMatch(/\bplease\b/);
20
+ (0, vitest_1.expect)(result.optimized.toLowerCase()).not.toMatch(/\bjust\b/);
21
+ (0, vitest_1.expect)(result.optimized).toContain('provide the answer');
22
+ });
23
+ (0, vitest_1.it)('does NOT remove fillers when safety=safe', () => {
24
+ const result = (0, optimizer_1.optimize)('Please provide the answer.', { safety: 'safe' });
25
+ // filler-words is moderate, must be skipped
26
+ (0, vitest_1.expect)(result.optimized.toLowerCase()).toContain('please');
27
+ });
28
+ });
29
+ // ── Verbose phrase replacement ───────────────────────────────────────────────
30
+ (0, vitest_1.describe)('verbose-phrases pass', () => {
31
+ (0, vitest_1.it)('replaces "in order to" with "to"', () => {
32
+ const result = (0, optimizer_1.optimize)('Use this in order to complete the task.', { safety: 'moderate' });
33
+ (0, vitest_1.expect)(result.optimized).not.toContain('in order to');
34
+ (0, vitest_1.expect)(result.optimized).toContain('to complete the task');
35
+ });
36
+ (0, vitest_1.it)('replaces "due to the fact that" with "because"', () => {
37
+ const result = (0, optimizer_1.optimize)('This failed due to the fact that the input was empty.', { safety: 'moderate' });
38
+ (0, vitest_1.expect)(result.optimized).not.toContain('due to the fact that');
39
+ (0, vitest_1.expect)(result.optimized).toContain('because');
40
+ });
41
+ (0, vitest_1.it)('strips "it is important to note that" from sentence', () => {
42
+ const result = (0, optimizer_1.optimize)('It is important to note that you should save your work.', { safety: 'moderate' });
43
+ (0, vitest_1.expect)(result.optimized).not.toContain('It is important to note that');
44
+ (0, vitest_1.expect)(result.optimized).toContain('you should save your work');
45
+ });
46
+ (0, vitest_1.it)('does NOT apply verbose-phrases when safety=safe', () => {
47
+ const result = (0, optimizer_1.optimize)('Use this in order to complete the task.', { safety: 'safe' });
48
+ (0, vitest_1.expect)(result.optimized).toContain('in order to');
49
+ });
50
+ });
51
+ // ── Safety level gating ──────────────────────────────────────────────────────
52
+ (0, vitest_1.describe)('safety level gating', () => {
53
+ (0, vitest_1.it)('safe level skips all moderate passes', () => {
54
+ const result = (0, optimizer_1.optimize)('Please just use this in order to complete the task.', { safety: 'safe' });
55
+ const moderatePasses = result.report.passes.filter((p) => p.safetyLevel === 'moderate');
56
+ for (const p of moderatePasses) {
57
+ (0, vitest_1.expect)(p.applied).toBe(false);
58
+ (0, vitest_1.expect)(p.skipReason).toBe('safety-level');
59
+ }
60
+ });
61
+ (0, vitest_1.it)('moderate level applies both safe and moderate passes', () => {
62
+ const result = (0, optimizer_1.optimize)('Please just do this.\n\n\n\nAnd that.', { safety: 'moderate' });
63
+ const safeApplied = result.report.passes.filter((p) => p.safetyLevel === 'safe' && p.applied);
64
+ const moderateApplied = result.report.passes.filter((p) => p.safetyLevel === 'moderate' && p.applied);
65
+ // At least some safe passes and some moderate passes should have been applied
66
+ (0, vitest_1.expect)(safeApplied.length + moderateApplied.length).toBeGreaterThan(0);
67
+ // No skipped passes at moderate level (none are aggressive)
68
+ const skipped = result.report.passes.filter((p) => p.skipReason === 'safety-level');
69
+ (0, vitest_1.expect)(skipped.length).toBe(0);
70
+ });
71
+ });
72
+ // ── Protected regions: template variables ────────────────────────────────────
73
+ (0, vitest_1.describe)('protected regions - template variables', () => {
74
+ (0, vitest_1.it)('does not touch {{variable}} placeholders', () => {
75
+ const input = 'Please summarize {{user_content}} in just a few words.';
76
+ const result = (0, optimizer_1.optimize)(input, { safety: 'moderate' });
77
+ (0, vitest_1.expect)(result.optimized).toContain('{{user_content}}');
78
+ });
79
+ (0, vitest_1.it)('does not touch ${variable} placeholders', () => {
80
+ const input = 'Please process ${input_data} and return the result.';
81
+ const result = (0, optimizer_1.optimize)(input, { safety: 'moderate' });
82
+ (0, vitest_1.expect)(result.optimized).toContain('${input_data}');
83
+ });
84
+ (0, vitest_1.it)('does not touch %(var)s placeholders', () => {
85
+ const input = 'Please format %(name)s correctly.';
86
+ const result = (0, optimizer_1.optimize)(input, { safety: 'moderate' });
87
+ (0, vitest_1.expect)(result.optimized).toContain('%(name)s');
88
+ });
89
+ });
90
+ // ── Protected regions: code blocks ───────────────────────────────────────────
91
+ (0, vitest_1.describe)('protected regions - code blocks', () => {
92
+ (0, vitest_1.it)('preserves triple-backtick code blocks unchanged', () => {
93
+ const code = '```python\n# please just do this\nprint("hello")\n```';
94
+ const input = `Run the following code:\n${code}`;
95
+ const result = (0, optimizer_1.optimize)(input, { safety: 'moderate' });
96
+ (0, vitest_1.expect)(result.optimized).toContain(code);
97
+ });
98
+ (0, vitest_1.it)('preserves inline code unchanged', () => {
99
+ const input = 'Use the command `please just run` to execute it.';
100
+ const result = (0, optimizer_1.optimize)(input, { safety: 'moderate' });
101
+ (0, vitest_1.expect)(result.optimized).toContain('`please just run`');
102
+ });
103
+ (0, vitest_1.it)('does not strip hash comments inside code blocks', () => {
104
+ const input = 'Here is the code:\n```bash\n# install dependencies\nnpm install\n```';
105
+ const result = (0, optimizer_1.optimize)(input, { safety: 'moderate' });
106
+ (0, vitest_1.expect)(result.optimized).toContain('# install dependencies');
107
+ });
108
+ });
109
+ // ── OptimizationResult shape ──────────────────────────────────────────────────
110
+ (0, vitest_1.describe)('OptimizationResult shape', () => {
111
+ (0, vitest_1.it)('has optimized, original, and report fields', () => {
112
+ const result = (0, optimizer_1.optimize)('Please just do this in order to complete the task.');
113
+ (0, vitest_1.expect)(typeof result.optimized).toBe('string');
114
+ (0, vitest_1.expect)(typeof result.original).toBe('string');
115
+ (0, vitest_1.expect)(result.original).toBe('Please just do this in order to complete the task.');
116
+ (0, vitest_1.expect)(result.report).toBeDefined();
117
+ });
118
+ (0, vitest_1.it)('report has required fields', () => {
119
+ const result = (0, optimizer_1.optimize)('Some text.');
120
+ const { report } = result;
121
+ (0, vitest_1.expect)(typeof report.timestamp).toBe('string');
122
+ (0, vitest_1.expect)(typeof report.durationMs).toBe('number');
123
+ (0, vitest_1.expect)(['safe', 'moderate', 'aggressive']).toContain(report.safetyLevel);
124
+ (0, vitest_1.expect)(Array.isArray(report.passes)).toBe(true);
125
+ (0, vitest_1.expect)(report.savings).toBeDefined();
126
+ });
127
+ (0, vitest_1.it)('tokensSaved >= 0', () => {
128
+ const result = (0, optimizer_1.optimize)('Please just provide the answer in order to complete the task.');
129
+ (0, vitest_1.expect)(result.report.savings.tokensSaved).toBeGreaterThanOrEqual(0);
130
+ });
131
+ (0, vitest_1.it)('percentage is in [0, 100]', () => {
132
+ const result = (0, optimizer_1.optimize)('Please just provide the answer in order to complete the task.');
133
+ (0, vitest_1.expect)(result.report.savings.percentage).toBeGreaterThanOrEqual(0);
134
+ (0, vitest_1.expect)(result.report.savings.percentage).toBeLessThanOrEqual(100);
135
+ });
136
+ (0, vitest_1.it)('each PassResult has required fields', () => {
137
+ const result = (0, optimizer_1.optimize)('Some text with filler words please.');
138
+ for (const p of result.report.passes) {
139
+ (0, vitest_1.expect)(typeof p.id).toBe('string');
140
+ (0, vitest_1.expect)(typeof p.name).toBe('string');
141
+ (0, vitest_1.expect)(typeof p.applied).toBe('boolean');
142
+ (0, vitest_1.expect)(typeof p.tokensSaved).toBe('number');
143
+ (0, vitest_1.expect)(p.tokensSaved).toBeGreaterThanOrEqual(0);
144
+ (0, vitest_1.expect)(typeof p.durationMs).toBe('number');
145
+ }
146
+ });
147
+ });
148
+ // ── analyze() ────────────────────────────────────────────────────────────────
149
+ (0, vitest_1.describe)('analyze()', () => {
150
+ (0, vitest_1.it)('returns the same report as optimize().report', () => {
151
+ const input = 'Please just provide the answer in order to complete the task.';
152
+ const report = (0, optimizer_1.analyze)(input, { safety: 'moderate' });
153
+ (0, vitest_1.expect)(report.passes.length).toBeGreaterThan(0);
154
+ (0, vitest_1.expect)(typeof report.savings.tokensSaved).toBe('number');
155
+ });
156
+ });
157
+ // ── createOptimizer() ─────────────────────────────────────────────────────────
158
+ (0, vitest_1.describe)('createOptimizer()', () => {
159
+ (0, vitest_1.it)('returns an Optimizer object with optimize and analyze methods', () => {
160
+ const optimizer = (0, optimizer_1.createOptimizer)({ safety: 'safe' });
161
+ (0, vitest_1.expect)(typeof optimizer.optimize).toBe('function');
162
+ (0, vitest_1.expect)(typeof optimizer.analyze).toBe('function');
163
+ });
164
+ (0, vitest_1.it)('optimizer.optimize uses the configured safety level', () => {
165
+ const optimizer = (0, optimizer_1.createOptimizer)({ safety: 'safe' });
166
+ const result = optimizer.optimize('Please just do this in order to complete.');
167
+ // At safe level, filler-words pass should be skipped
168
+ const fillerPass = result.report.passes.find((p) => p.id === 'filler-words');
169
+ (0, vitest_1.expect)(fillerPass?.applied).toBe(false);
170
+ (0, vitest_1.expect)(fillerPass?.skipReason).toBe('safety-level');
171
+ });
172
+ (0, vitest_1.it)('optimizer.analyze returns an OptimizationReport', () => {
173
+ const optimizer = (0, optimizer_1.createOptimizer)({ safety: 'moderate' });
174
+ const report = optimizer.analyze('Use this in order to test.');
175
+ (0, vitest_1.expect)(report.safetyLevel).toBe('moderate');
176
+ (0, vitest_1.expect)(report.passes.length).toBeGreaterThan(0);
177
+ });
178
+ });
179
+ // ── Whitespace normalization ──────────────────────────────────────────────────
180
+ (0, vitest_1.describe)('whitespace-normalize pass', () => {
181
+ (0, vitest_1.it)('collapses 3+ blank lines to 2', () => {
182
+ const result = (0, optimizer_1.optimize)('Line one.\n\n\n\nLine two.', { safety: 'safe' });
183
+ (0, vitest_1.expect)(result.optimized).not.toMatch(/\n{4,}/);
184
+ });
185
+ (0, vitest_1.it)('removes trailing whitespace', () => {
186
+ const result = (0, optimizer_1.optimize)('Line one. \nLine two. ', { safety: 'safe' });
187
+ (0, vitest_1.expect)(result.optimized).not.toMatch(/[ \t]+\n/);
188
+ (0, vitest_1.expect)(result.optimized).not.toMatch(/[ \t]+$/);
189
+ });
190
+ });
191
+ // ── Custom token counter ──────────────────────────────────────────────────────
192
+ (0, vitest_1.describe)('custom tokenCounter option', () => {
193
+ (0, vitest_1.it)('uses the provided token counter', () => {
194
+ let callCount = 0;
195
+ const counter = (t) => {
196
+ callCount++;
197
+ return t.length;
198
+ };
199
+ (0, optimizer_1.optimize)('Please provide the answer.', { safety: 'moderate', tokenCounter: counter });
200
+ (0, vitest_1.expect)(callCount).toBeGreaterThan(0);
201
+ });
202
+ });
203
+ //# sourceMappingURL=optimize.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.test.js","sourceRoot":"","sources":["../../src/__tests__/optimize.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { optimize, analyze, createOptimizer } from './optimizer';
2
+ export type { SafetyLevel, ChangeEntry, PassResult, TokenSavings, OptimizationReport, OptimizationResult, OptimizeOptions, Optimizer, } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,SAAS,GACV,MAAM,SAAS,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOptimizer = exports.analyze = exports.optimize = void 0;
4
+ // prompt-optimize - Compress prompts to use fewer tokens via deterministic heuristics
5
+ var optimizer_1 = require("./optimizer");
6
+ Object.defineProperty(exports, "optimize", { enumerable: true, get: function () { return optimizer_1.optimize; } });
7
+ Object.defineProperty(exports, "analyze", { enumerable: true, get: function () { return optimizer_1.analyze; } });
8
+ Object.defineProperty(exports, "createOptimizer", { enumerable: true, get: function () { return optimizer_1.createOptimizer; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,sFAAsF;AACtF,yCAAgE;AAAvD,qGAAA,QAAQ,OAAA;AAAE,oGAAA,OAAO,OAAA;AAAE,4GAAA,eAAe,OAAA"}
@@ -0,0 +1,5 @@
1
+ import type { OptimizationReport, OptimizationResult, OptimizeOptions, Optimizer } from './types';
2
+ export declare function optimize(input: string, options?: OptimizeOptions): OptimizationResult;
3
+ export declare function analyze(input: string, options?: OptimizeOptions): OptimizationReport;
4
+ export declare function createOptimizer(options: OptimizeOptions): Optimizer;
5
+ //# sourceMappingURL=optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,SAAS,EACV,MAAM,SAAS,CAAA;AA+BhB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,kBAAkB,CA6DrF;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,kBAAkB,CAEpF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,CAKnE"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.optimize = optimize;
37
+ exports.analyze = analyze;
38
+ exports.createOptimizer = createOptimizer;
39
+ const protect_1 = require("./protect");
40
+ const trailingSpaces = __importStar(require("./passes/trailing-spaces"));
41
+ const emptyLines = __importStar(require("./passes/empty-lines"));
42
+ const whitespaceNormalize = __importStar(require("./passes/whitespace-normalize"));
43
+ const commentStrip = __importStar(require("./passes/comment-strip"));
44
+ const fillerWords = __importStar(require("./passes/filler-words"));
45
+ const verbosePhrases = __importStar(require("./passes/verbose-phrases"));
46
+ const preambleStrip = __importStar(require("./passes/preamble-strip"));
47
+ const redundancyMerge = __importStar(require("./passes/redundancy-merge"));
48
+ const ALL_PASSES = [
49
+ trailingSpaces,
50
+ emptyLines,
51
+ whitespaceNormalize,
52
+ commentStrip,
53
+ fillerWords,
54
+ verbosePhrases,
55
+ preambleStrip,
56
+ redundancyMerge,
57
+ ];
58
+ const SAFETY_FILTER = {
59
+ safe: ['safe'],
60
+ moderate: ['safe', 'moderate'],
61
+ aggressive: ['safe', 'moderate', 'aggressive'],
62
+ };
63
+ function defaultTokenCounter(text) {
64
+ return Math.ceil(text.length / 4);
65
+ }
66
+ function optimize(input, options) {
67
+ const safety = options?.safety ?? 'moderate';
68
+ const counter = options?.tokenCounter ?? defaultTokenCounter;
69
+ const start = Date.now();
70
+ const original = input;
71
+ const regions = (0, protect_1.findProtectedRegions)(input);
72
+ const passResults = [];
73
+ let current = input;
74
+ for (const pass of ALL_PASSES) {
75
+ if (!SAFETY_FILTER[safety].includes(pass.safetyLevel)) {
76
+ passResults.push({
77
+ id: pass.id,
78
+ name: pass.name,
79
+ safetyLevel: pass.safetyLevel,
80
+ applied: false,
81
+ skipReason: 'safety-level',
82
+ tokensSaved: 0,
83
+ changeCount: 0,
84
+ durationMs: 0,
85
+ });
86
+ continue;
87
+ }
88
+ const t = Date.now();
89
+ const after = pass.run(current, regions);
90
+ const saved = counter(current) - counter(after);
91
+ passResults.push({
92
+ id: pass.id,
93
+ name: pass.name,
94
+ safetyLevel: pass.safetyLevel,
95
+ applied: after !== current,
96
+ tokensSaved: Math.max(0, saved),
97
+ changeCount: 0,
98
+ durationMs: Date.now() - t,
99
+ });
100
+ current = after;
101
+ }
102
+ const tokensBefore = counter(original);
103
+ const tokensAfter = counter(current);
104
+ const savings = {
105
+ charactersBefore: original.length,
106
+ charactersAfter: current.length,
107
+ tokensBefore,
108
+ tokensAfter,
109
+ tokensSaved: Math.max(0, tokensBefore - tokensAfter),
110
+ percentage: parseFloat(((1 - tokensAfter / Math.max(1, tokensBefore)) * 100).toFixed(1)),
111
+ };
112
+ return {
113
+ optimized: current,
114
+ original,
115
+ report: {
116
+ timestamp: new Date().toISOString(),
117
+ durationMs: Date.now() - start,
118
+ safetyLevel: safety,
119
+ savings,
120
+ passes: passResults,
121
+ },
122
+ };
123
+ }
124
+ function analyze(input, options) {
125
+ return optimize(input, options).report;
126
+ }
127
+ function createOptimizer(options) {
128
+ return {
129
+ optimize: (input) => optimize(input, options),
130
+ analyze: (input) => analyze(input, options),
131
+ };
132
+ }
133
+ //# sourceMappingURL=optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ProtectedRegion } from '../protect';
2
+ import type { SafetyLevel } from '../types';
3
+ export declare const id = "comment-strip";
4
+ export declare const name = "Comment Strip";
5
+ export declare const safetyLevel: SafetyLevel;
6
+ export declare function run(text: string, regions: ProtectedRegion[]): string;
7
+ //# sourceMappingURL=comment-strip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-strip.d.ts","sourceRoot":"","sources":["../../src/passes/comment-strip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,EAAE,kBAAkB,CAAA;AACjC,eAAO,MAAM,IAAI,kBAAkB,CAAA;AACnC,eAAO,MAAM,WAAW,EAAE,WAAoB,CAAA;AAE9C,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAapE"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safetyLevel = exports.name = exports.id = void 0;
4
+ exports.run = run;
5
+ const protect_1 = require("../protect");
6
+ exports.id = 'comment-strip';
7
+ exports.name = 'Comment Strip';
8
+ exports.safetyLevel = 'safe';
9
+ function run(text, regions) {
10
+ return (0, protect_1.applyWithProtection)(text, regions, (segment) => {
11
+ let s = segment;
12
+ // Remove HTML comments: <!-- ... -->
13
+ s = s.replace(/<!--[\s\S]*?-->/g, '');
14
+ // Remove C-style line comments: // ... only if line STARTS with //
15
+ s = s.replace(/^[ \t]*\/\/.*$/gm, '');
16
+ // Remove hash comments: # ... only if line STARTS with #
17
+ s = s.replace(/^[ \t]*#.*$/gm, '');
18
+ // Clean up blank lines left by removed comments
19
+ s = s.replace(/\n{3,}/g, '\n\n');
20
+ return s;
21
+ });
22
+ }
23
+ //# sourceMappingURL=comment-strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-strip.js","sourceRoot":"","sources":["../../src/passes/comment-strip.ts"],"names":[],"mappings":";;;AAQA,kBAaC;AApBD,wCAAgD;AAGnC,QAAA,EAAE,GAAG,eAAe,CAAA;AACpB,QAAA,IAAI,GAAG,eAAe,CAAA;AACtB,QAAA,WAAW,GAAgB,MAAM,CAAA;AAE9C,SAAgB,GAAG,CAAC,IAAY,EAAE,OAA0B;IAC1D,OAAO,IAAA,6BAAmB,EAAC,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,IAAI,CAAC,GAAG,OAAO,CAAA;QACf,qCAAqC;QACrC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;QACrC,mEAAmE;QACnE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;QACrC,yDAAyD;QACzD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;QAClC,gDAAgD;QAChD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAChC,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProtectedRegion } from '../protect';
2
+ import type { SafetyLevel } from '../types';
3
+ export declare const id = "empty-lines";
4
+ export declare const name = "Empty Lines";
5
+ export declare const safetyLevel: SafetyLevel;
6
+ export declare function run(text: string, regions: ProtectedRegion[]): string;
7
+ //# sourceMappingURL=empty-lines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-lines.d.ts","sourceRoot":"","sources":["../../src/passes/empty-lines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,EAAE,gBAAgB,CAAA;AAC/B,eAAO,MAAM,IAAI,gBAAgB,CAAA;AACjC,eAAO,MAAM,WAAW,EAAE,WAAoB,CAAA;AAE9C,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAUpE"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safetyLevel = exports.name = exports.id = void 0;
4
+ exports.run = run;
5
+ const protect_1 = require("../protect");
6
+ exports.id = 'empty-lines';
7
+ exports.name = 'Empty Lines';
8
+ exports.safetyLevel = 'safe';
9
+ function run(text, regions) {
10
+ return (0, protect_1.applyWithProtection)(text, regions, (segment) => {
11
+ // Collapse 4+ consecutive empty lines → 2 empty lines
12
+ let s = segment.replace(/\n{5,}/g, '\n\n\n');
13
+ // Remove empty lines at start of document
14
+ s = s.replace(/^\n+/, '');
15
+ // Remove empty lines at end of document
16
+ s = s.replace(/\n+$/, '');
17
+ return s;
18
+ });
19
+ }
20
+ //# sourceMappingURL=empty-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-lines.js","sourceRoot":"","sources":["../../src/passes/empty-lines.ts"],"names":[],"mappings":";;;AAQA,kBAUC;AAjBD,wCAAgD;AAGnC,QAAA,EAAE,GAAG,aAAa,CAAA;AAClB,QAAA,IAAI,GAAG,aAAa,CAAA;AACpB,QAAA,WAAW,GAAgB,MAAM,CAAA;AAE9C,SAAgB,GAAG,CAAC,IAAY,EAAE,OAA0B;IAC1D,OAAO,IAAA,6BAAmB,EAAC,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,sDAAsD;QACtD,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAC5C,0CAA0C;QAC1C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACzB,wCAAwC;QACxC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACzB,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProtectedRegion } from '../protect';
2
+ import type { SafetyLevel } from '../types';
3
+ export declare const id = "filler-words";
4
+ export declare const name = "Filler Words";
5
+ export declare const safetyLevel: SafetyLevel;
6
+ export declare function run(text: string, regions: ProtectedRegion[]): string;
7
+ //# sourceMappingURL=filler-words.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filler-words.d.ts","sourceRoot":"","sources":["../../src/passes/filler-words.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,EAAE,iBAAiB,CAAA;AAChC,eAAO,MAAM,IAAI,iBAAiB,CAAA;AAClC,eAAO,MAAM,WAAW,EAAE,WAAwB,CAAA;AAelD,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAapE"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safetyLevel = exports.name = exports.id = void 0;
4
+ exports.run = run;
5
+ const protect_1 = require("../protect");
6
+ exports.id = 'filler-words';
7
+ exports.name = 'Filler Words';
8
+ exports.safetyLevel = 'moderate';
9
+ const FILLERS = [
10
+ 'please ',
11
+ 'kindly ',
12
+ 'just ',
13
+ 'simply ',
14
+ 'basically ',
15
+ 'actually ',
16
+ 'certainly ',
17
+ 'of course ',
18
+ 'obviously ',
19
+ 'you know ',
20
+ ];
21
+ function run(text, regions) {
22
+ return (0, protect_1.applyWithProtection)(text, regions, (segment) => {
23
+ let s = segment;
24
+ for (const filler of FILLERS) {
25
+ // Word-boundary matched, case-insensitive
26
+ const escaped = filler.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').trimEnd();
27
+ const re = new RegExp(`\\b${escaped}\\s*`, 'gi');
28
+ s = s.replace(re, '');
29
+ }
30
+ // Clean up any doubled whitespace left behind (not at line start)
31
+ s = s.replace(/([^\n]) {2,}/g, '$1 ');
32
+ return s;
33
+ });
34
+ }
35
+ //# sourceMappingURL=filler-words.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filler-words.js","sourceRoot":"","sources":["../../src/passes/filler-words.ts"],"names":[],"mappings":";;;AAqBA,kBAaC;AAjCD,wCAAgD;AAGnC,QAAA,EAAE,GAAG,cAAc,CAAA;AACnB,QAAA,IAAI,GAAG,cAAc,CAAA;AACrB,QAAA,WAAW,GAAgB,UAAU,CAAA;AAElD,MAAM,OAAO,GAAG;IACd,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,WAAW;CACZ,CAAA;AAED,SAAgB,GAAG,CAAC,IAAY,EAAE,OAA0B;IAC1D,OAAO,IAAA,6BAAmB,EAAC,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,IAAI,CAAC,GAAG,OAAO,CAAA;QACf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,0CAA0C;YAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAA;YACvE,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,MAAM,EAAE,IAAI,CAAC,CAAA;YAChD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACvB,CAAC;QACD,kEAAkE;QAClE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;QACrC,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProtectedRegion } from '../protect';
2
+ import type { SafetyLevel } from '../types';
3
+ export declare const id = "preamble-strip";
4
+ export declare const name = "Preamble Strip";
5
+ export declare const safetyLevel: SafetyLevel;
6
+ export declare function run(text: string, regions: ProtectedRegion[]): string;
7
+ //# sourceMappingURL=preamble-strip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preamble-strip.d.ts","sourceRoot":"","sources":["../../src/passes/preamble-strip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,EAAE,mBAAmB,CAAA;AAClC,eAAO,MAAM,IAAI,mBAAmB,CAAA;AACpC,eAAO,MAAM,WAAW,EAAE,WAAwB,CAAA;AAelD,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAQpE"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safetyLevel = exports.name = exports.id = void 0;
4
+ exports.run = run;
5
+ const protect_1 = require("../protect");
6
+ exports.id = 'preamble-strip';
7
+ exports.name = 'Preamble Strip';
8
+ exports.safetyLevel = 'moderate';
9
+ const PREAMBLES = [
10
+ /^Certainly!\s+Here\s+is[^.!?]*[.!?]?\s*/i,
11
+ /^Certainly!\s+I['']ll[^.!?]*[.!?]?\s*/i,
12
+ /^Certainly!\s*/i,
13
+ /^Of\s+course!\s+I['']ll[^.!?]*[.!?]?\s*/i,
14
+ /^Of\s+course!\s*/i,
15
+ /^Sure!\s+Let\s+me[^.!?]*[.!?]?\s*/i,
16
+ /^Sure!\s*/i,
17
+ /^I['']d\s+be\s+happy\s+to[^.!?]*[.!?]?\s*/i,
18
+ /^You\s+are\s+a\s+helpful\s+assistant\.\s*/i,
19
+ /^The\s+following\s+is\s+a[^.!?]*[.!?]?\s*/i,
20
+ ];
21
+ function run(text, regions) {
22
+ return (0, protect_1.applyWithProtection)(text, regions, (segment) => {
23
+ let s = segment;
24
+ for (const pattern of PREAMBLES) {
25
+ s = s.replace(pattern, '');
26
+ }
27
+ return s;
28
+ });
29
+ }
30
+ //# sourceMappingURL=preamble-strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preamble-strip.js","sourceRoot":"","sources":["../../src/passes/preamble-strip.ts"],"names":[],"mappings":";;;AAqBA,kBAQC;AA5BD,wCAAgD;AAGnC,QAAA,EAAE,GAAG,gBAAgB,CAAA;AACrB,QAAA,IAAI,GAAG,gBAAgB,CAAA;AACvB,QAAA,WAAW,GAAgB,UAAU,CAAA;AAElD,MAAM,SAAS,GAAa;IAC1B,0CAA0C;IAC1C,wCAAwC;IACxC,iBAAiB;IACjB,0CAA0C;IAC1C,mBAAmB;IACnB,oCAAoC;IACpC,YAAY;IACZ,4CAA4C;IAC5C,4CAA4C;IAC5C,4CAA4C;CAC7C,CAAA;AAED,SAAgB,GAAG,CAAC,IAAY,EAAE,OAA0B;IAC1D,OAAO,IAAA,6BAAmB,EAAC,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,IAAI,CAAC,GAAG,OAAO,CAAA;QACf,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QAC5B,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProtectedRegion } from '../protect';
2
+ import type { SafetyLevel } from '../types';
3
+ export declare const id = "redundancy-merge";
4
+ export declare const name = "Redundancy Merge";
5
+ export declare const safetyLevel: SafetyLevel;
6
+ export declare function run(text: string, regions: ProtectedRegion[]): string;
7
+ //# sourceMappingURL=redundancy-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redundancy-merge.d.ts","sourceRoot":"","sources":["../../src/passes/redundancy-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,EAAE,qBAAqB,CAAA;AACpC,eAAO,MAAM,IAAI,qBAAqB,CAAA;AACtC,eAAO,MAAM,WAAW,EAAE,WAAwB,CAAA;AAmClD,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CA8BpE"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safetyLevel = exports.name = exports.id = void 0;
4
+ exports.run = run;
5
+ const protect_1 = require("../protect");
6
+ exports.id = 'redundancy-merge';
7
+ exports.name = 'Redundancy Merge';
8
+ exports.safetyLevel = 'moderate';
9
+ function tokenize(sentence) {
10
+ return new Set(sentence
11
+ .toLowerCase()
12
+ .replace(/[^a-z0-9\s]/g, '')
13
+ .split(/\s+/)
14
+ .filter(Boolean));
15
+ }
16
+ function jaccardSimilarity(a, b) {
17
+ if (a.size === 0 && b.size === 0)
18
+ return 1;
19
+ let intersection = 0;
20
+ for (const token of a) {
21
+ if (b.has(token))
22
+ intersection++;
23
+ }
24
+ const union = a.size + b.size - intersection;
25
+ return union === 0 ? 0 : intersection / union;
26
+ }
27
+ function splitSentences(text) {
28
+ const result = [];
29
+ const re = /[^.!?\n]+[.!?\n]?/g;
30
+ let m;
31
+ while ((m = re.exec(text)) !== null) {
32
+ const trimmed = m[0].trim();
33
+ if (trimmed.length > 0) {
34
+ result.push({ sentence: m[0], start: m.index, end: m.index + m[0].length });
35
+ }
36
+ }
37
+ return result;
38
+ }
39
+ function run(text, regions) {
40
+ const sentences = splitSentences(text);
41
+ if (sentences.length < 2)
42
+ return text;
43
+ const redundant = new Set();
44
+ const tokenSets = sentences.map((s) => tokenize(s.sentence));
45
+ for (let i = 0; i < sentences.length; i++) {
46
+ if (redundant.has(i))
47
+ continue;
48
+ if ((0, protect_1.isProtected)(sentences[i].start, regions))
49
+ continue;
50
+ for (let j = i + 1; j < sentences.length; j++) {
51
+ if (redundant.has(j))
52
+ continue;
53
+ if ((0, protect_1.isProtected)(sentences[j].start, regions))
54
+ continue;
55
+ const sim = jaccardSimilarity(tokenSets[i], tokenSets[j]);
56
+ if (sim > 0.85) {
57
+ redundant.add(j);
58
+ }
59
+ }
60
+ }
61
+ if (redundant.size === 0)
62
+ return text;
63
+ let result = '';
64
+ for (let i = 0; i < sentences.length; i++) {
65
+ if (!redundant.has(i)) {
66
+ result += sentences[i].sentence;
67
+ }
68
+ }
69
+ return result;
70
+ }
71
+ //# sourceMappingURL=redundancy-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redundancy-merge.js","sourceRoot":"","sources":["../../src/passes/redundancy-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ProtectedRegion } from '../protect';
2
+ import type { SafetyLevel } from '../types';
3
+ export declare const id = "trailing-spaces";
4
+ export declare const name = "Trailing Spaces";
5
+ export declare const safetyLevel: SafetyLevel;
6
+ export declare function run(text: string, regions: ProtectedRegion[]): string;
7
+ //# sourceMappingURL=trailing-spaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailing-spaces.d.ts","sourceRoot":"","sources":["../../src/passes/trailing-spaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,EAAE,oBAAoB,CAAA;AACnC,eAAO,MAAM,IAAI,oBAAoB,CAAA;AACrC,eAAO,MAAM,WAAW,EAAE,WAAoB,CAAA;AAE9C,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAIpE"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safetyLevel = exports.name = exports.id = void 0;
4
+ exports.run = run;
5
+ const protect_1 = require("../protect");
6
+ exports.id = 'trailing-spaces';
7
+ exports.name = 'Trailing Spaces';
8
+ exports.safetyLevel = 'safe';
9
+ function run(text, regions) {
10
+ return (0, protect_1.applyWithProtection)(text, regions, (segment) => {
11
+ return segment.replace(/[ \t]+$/gm, '');
12
+ });
13
+ }
14
+ //# sourceMappingURL=trailing-spaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailing-spaces.js","sourceRoot":"","sources":["../../src/passes/trailing-spaces.ts"],"names":[],"mappings":";;;AAQA,kBAIC;AAXD,wCAAgD;AAGnC,QAAA,EAAE,GAAG,iBAAiB,CAAA;AACtB,QAAA,IAAI,GAAG,iBAAiB,CAAA;AACxB,QAAA,WAAW,GAAgB,MAAM,CAAA;AAE9C,SAAgB,GAAG,CAAC,IAAY,EAAE,OAA0B;IAC1D,OAAO,IAAA,6BAAmB,EAAC,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProtectedRegion } from '../protect';
2
+ import type { SafetyLevel } from '../types';
3
+ export declare const id = "verbose-phrases";
4
+ export declare const name = "Verbose Phrases";
5
+ export declare const safetyLevel: SafetyLevel;
6
+ export declare function run(text: string, regions: ProtectedRegion[]): string;
7
+ //# sourceMappingURL=verbose-phrases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verbose-phrases.d.ts","sourceRoot":"","sources":["../../src/passes/verbose-phrases.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,EAAE,oBAAoB,CAAA;AACnC,eAAO,MAAM,IAAI,oBAAoB,CAAA;AACrC,eAAO,MAAM,WAAW,EAAE,WAAwB,CAAA;AAoBlD,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAYpE"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safetyLevel = exports.name = exports.id = void 0;
4
+ exports.run = run;
5
+ const protect_1 = require("../protect");
6
+ exports.id = 'verbose-phrases';
7
+ exports.name = 'Verbose Phrases';
8
+ exports.safetyLevel = 'moderate';
9
+ const REPLACEMENTS = [
10
+ [/in order to/gi, 'to'],
11
+ [/due to the fact that/gi, 'because'],
12
+ [/at this point in time/gi, 'now'],
13
+ [/in the event that/gi, 'if'],
14
+ [/for the purpose of/gi, 'to'],
15
+ [/with regard to/gi, 'about'],
16
+ [/in the process of/gi, 'while'],
17
+ [/make sure to/gi, 'ensure'],
18
+ [/it is important to note that/gi, ''],
19
+ [/it should be noted that/gi, ''],
20
+ [/please note that/gi, ''],
21
+ [/as previously mentioned/gi, ''],
22
+ [/as stated above/gi, ''],
23
+ [/needless to say/gi, ''],
24
+ [/at the end of the day/gi, ''],
25
+ ];
26
+ function run(text, regions) {
27
+ return (0, protect_1.applyWithProtection)(text, regions, (segment) => {
28
+ let s = segment;
29
+ for (const [pattern, replacement] of REPLACEMENTS) {
30
+ s = s.replace(pattern, replacement);
31
+ }
32
+ // Clean up any doubled whitespace left behind
33
+ s = s.replace(/([^\n]) {2,}/g, '$1 ');
34
+ // Clean up leading whitespace on lines that got prefix stripped
35
+ s = s.replace(/^[ \t]+([^ \t])/gm, '$1');
36
+ return s;
37
+ });
38
+ }
39
+ //# sourceMappingURL=verbose-phrases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verbose-phrases.js","sourceRoot":"","sources":["../../src/passes/verbose-phrases.ts"],"names":[],"mappings":";;;AA0BA,kBAYC;AArCD,wCAAgD;AAGnC,QAAA,EAAE,GAAG,iBAAiB,CAAA;AACtB,QAAA,IAAI,GAAG,iBAAiB,CAAA;AACxB,QAAA,WAAW,GAAgB,UAAU,CAAA;AAElD,MAAM,YAAY,GAAuB;IACvC,CAAC,eAAe,EAAE,IAAI,CAAC;IACvB,CAAC,wBAAwB,EAAE,SAAS,CAAC;IACrC,CAAC,yBAAyB,EAAE,KAAK,CAAC;IAClC,CAAC,qBAAqB,EAAE,IAAI,CAAC;IAC7B,CAAC,sBAAsB,EAAE,IAAI,CAAC;IAC9B,CAAC,kBAAkB,EAAE,OAAO,CAAC;IAC7B,CAAC,qBAAqB,EAAE,OAAO,CAAC;IAChC,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IAC5B,CAAC,gCAAgC,EAAE,EAAE,CAAC;IACtC,CAAC,2BAA2B,EAAE,EAAE,CAAC;IACjC,CAAC,oBAAoB,EAAE,EAAE,CAAC;IAC1B,CAAC,2BAA2B,EAAE,EAAE,CAAC;IACjC,CAAC,mBAAmB,EAAE,EAAE,CAAC;IACzB,CAAC,mBAAmB,EAAE,EAAE,CAAC;IACzB,CAAC,yBAAyB,EAAE,EAAE,CAAC;CAChC,CAAA;AAED,SAAgB,GAAG,CAAC,IAAY,EAAE,OAA0B;IAC1D,OAAO,IAAA,6BAAmB,EAAC,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,IAAI,CAAC,GAAG,OAAO,CAAA;QACf,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,YAAY,EAAE,CAAC;YAClD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACrC,CAAC;QACD,8CAA8C;QAC9C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;QACrC,gEAAgE;QAChE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAA;QACxC,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProtectedRegion } from '../protect';
2
+ import type { SafetyLevel } from '../types';
3
+ export declare const id = "whitespace-normalize";
4
+ export declare const name = "Whitespace Normalize";
5
+ export declare const safetyLevel: SafetyLevel;
6
+ export declare function run(text: string, regions: ProtectedRegion[]): string;
7
+ //# sourceMappingURL=whitespace-normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whitespace-normalize.d.ts","sourceRoot":"","sources":["../../src/passes/whitespace-normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,EAAE,yBAAyB,CAAA;AACxC,eAAO,MAAM,IAAI,yBAAyB,CAAA;AAC1C,eAAO,MAAM,WAAW,EAAE,WAAoB,CAAA;AAE9C,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAYpE"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safetyLevel = exports.name = exports.id = void 0;
4
+ exports.run = run;
5
+ const protect_1 = require("../protect");
6
+ exports.id = 'whitespace-normalize';
7
+ exports.name = 'Whitespace Normalize';
8
+ exports.safetyLevel = 'safe';
9
+ function run(text, regions) {
10
+ return (0, protect_1.applyWithProtection)(text, regions, (segment) => {
11
+ // Normalize line endings to \n
12
+ let s = segment.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
13
+ // Remove trailing whitespace on each line
14
+ s = s.replace(/[ \t]+$/gm, '');
15
+ // Collapse 3+ blank lines → 2 blank lines
16
+ s = s.replace(/\n{3,}/g, '\n\n');
17
+ // Collapse 2+ spaces to 1, but not at line start (preserves indentation)
18
+ s = s.replace(/([^\n]) {2,}/g, '$1 ');
19
+ return s;
20
+ });
21
+ }
22
+ //# sourceMappingURL=whitespace-normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whitespace-normalize.js","sourceRoot":"","sources":["../../src/passes/whitespace-normalize.ts"],"names":[],"mappings":";;;AAQA,kBAYC;AAnBD,wCAAgD;AAGnC,QAAA,EAAE,GAAG,sBAAsB,CAAA;AAC3B,QAAA,IAAI,GAAG,sBAAsB,CAAA;AAC7B,QAAA,WAAW,GAAgB,MAAM,CAAA;AAE9C,SAAgB,GAAG,CAAC,IAAY,EAAE,OAA0B;IAC1D,OAAO,IAAA,6BAAmB,EAAC,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,+BAA+B;QAC/B,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC3D,0CAA0C;QAC1C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAC9B,0CAA0C;QAC1C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAChC,yEAAyE;QACzE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;QACrC,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ProtectedRegion {
2
+ start: number;
3
+ end: number;
4
+ reason: string;
5
+ }
6
+ export declare function findProtectedRegions(text: string): ProtectedRegion[];
7
+ export declare function isProtected(offset: number, regions: ProtectedRegion[]): boolean;
8
+ export declare function applyWithProtection(text: string, regions: ProtectedRegion[], replacer: (segment: string, offset: number) => string): string;
9
+ //# sourceMappingURL=protect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protect.d.ts","sourceRoot":"","sources":["../src/protect.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAqEpE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAK/E;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GACpD,MAAM,CAiCR"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findProtectedRegions = findProtectedRegions;
4
+ exports.isProtected = isProtected;
5
+ exports.applyWithProtection = applyWithProtection;
6
+ function findProtectedRegions(text) {
7
+ const regions = [];
8
+ // 1. Triple-backtick fenced code blocks: ```...```
9
+ const fenceRe = /```[\s\S]*?```/g;
10
+ let m;
11
+ while ((m = fenceRe.exec(text)) !== null) {
12
+ regions.push({ start: m.index, end: m.index + m[0].length, reason: 'code-block' });
13
+ }
14
+ // 2. Inline code: `...` (single backtick, not already inside a fence)
15
+ const inlineRe = /`[^`\n]+`/g;
16
+ while ((m = inlineRe.exec(text)) !== null) {
17
+ if (!isProtected(m.index, regions)) {
18
+ regions.push({ start: m.index, end: m.index + m[0].length, reason: 'inline-code' });
19
+ }
20
+ }
21
+ // 3. Template variables: {{var}}, {var}, ${var}, %(var)s
22
+ const templateRe = /\{\{[^}]+\}\}|\{[^}]+\}|\$\{[^}]+\}|%\([^)]+\)s/g;
23
+ while ((m = templateRe.exec(text)) !== null) {
24
+ if (!isProtected(m.index, regions)) {
25
+ regions.push({ start: m.index, end: m.index + m[0].length, reason: 'template-var' });
26
+ }
27
+ }
28
+ // 4. URLs: https?://[^\s]+
29
+ const urlRe = /https?:\/\/[^\s]+/g;
30
+ while ((m = urlRe.exec(text)) !== null) {
31
+ if (!isProtected(m.index, regions)) {
32
+ regions.push({ start: m.index, end: m.index + m[0].length, reason: 'url' });
33
+ }
34
+ }
35
+ // 5. Quoted strings: "..." and '...' (single-line only)
36
+ const quotedRe = /"[^"\n]*"|'[^'\n]*'/g;
37
+ while ((m = quotedRe.exec(text)) !== null) {
38
+ if (!isProtected(m.index, regions)) {
39
+ regions.push({ start: m.index, end: m.index + m[0].length, reason: 'quoted-string' });
40
+ }
41
+ }
42
+ // 6. HTML tags: <tag...>
43
+ const htmlRe = /<[a-zA-Z][^>]*>/g;
44
+ while ((m = htmlRe.exec(text)) !== null) {
45
+ if (!isProtected(m.index, regions)) {
46
+ regions.push({ start: m.index, end: m.index + m[0].length, reason: 'html-tag' });
47
+ }
48
+ }
49
+ // 7. Negation context: sentences containing negation words — mark whole sentence
50
+ const negationRe = /\b(not|never|don't|must not|do not|cannot|shouldn't|won't|no)\b/gi;
51
+ // Split text into sentences using sentence boundaries
52
+ const sentenceRe = /[^.!?\n]+[.!?\n]?/g;
53
+ let sentOffset = 0;
54
+ const sentences = text.match(sentenceRe) ?? [];
55
+ for (const sentence of sentences) {
56
+ const start = text.indexOf(sentence, sentOffset);
57
+ const end = start + sentence.length;
58
+ sentOffset = end;
59
+ negationRe.lastIndex = 0;
60
+ if (negationRe.test(sentence)) {
61
+ if (!isProtected(start, regions)) {
62
+ regions.push({ start, end, reason: 'negation-context' });
63
+ }
64
+ }
65
+ }
66
+ return regions;
67
+ }
68
+ function isProtected(offset, regions) {
69
+ for (const r of regions) {
70
+ if (offset >= r.start && offset < r.end)
71
+ return true;
72
+ }
73
+ return false;
74
+ }
75
+ function applyWithProtection(text, regions, replacer) {
76
+ if (regions.length === 0)
77
+ return replacer(text, 0);
78
+ // Sort regions by start
79
+ const sorted = [...regions].sort((a, b) => a.start - b.start);
80
+ // Merge overlapping regions
81
+ const merged = [];
82
+ for (const r of sorted) {
83
+ if (merged.length > 0 && r.start < merged[merged.length - 1].end) {
84
+ merged[merged.length - 1].end = Math.max(merged[merged.length - 1].end, r.end);
85
+ }
86
+ else {
87
+ merged.push({ ...r });
88
+ }
89
+ }
90
+ let result = '';
91
+ let pos = 0;
92
+ for (const region of merged) {
93
+ if (pos < region.start) {
94
+ const segment = text.slice(pos, region.start);
95
+ result += replacer(segment, pos);
96
+ }
97
+ result += text.slice(region.start, region.end);
98
+ pos = region.end;
99
+ }
100
+ if (pos < text.length) {
101
+ result += replacer(text.slice(pos), pos);
102
+ }
103
+ return result;
104
+ }
105
+ //# sourceMappingURL=protect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protect.js","sourceRoot":"","sources":["../src/protect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export type SafetyLevel = 'safe' | 'moderate' | 'aggressive';
2
+ export interface ChangeEntry {
3
+ passId: string;
4
+ original: string;
5
+ replacement: string;
6
+ offset: number;
7
+ line: number;
8
+ column: number;
9
+ }
10
+ export interface PassResult {
11
+ id: string;
12
+ name: string;
13
+ safetyLevel: SafetyLevel;
14
+ applied: boolean;
15
+ skipReason?: string;
16
+ tokensSaved: number;
17
+ changeCount: number;
18
+ durationMs: number;
19
+ }
20
+ export interface TokenSavings {
21
+ charactersBefore: number;
22
+ charactersAfter: number;
23
+ tokensBefore: number;
24
+ tokensAfter: number;
25
+ tokensSaved: number;
26
+ percentage: number;
27
+ }
28
+ export interface OptimizationReport {
29
+ timestamp: string;
30
+ durationMs: number;
31
+ safetyLevel: SafetyLevel;
32
+ savings: TokenSavings;
33
+ passes: PassResult[];
34
+ }
35
+ export interface OptimizationResult {
36
+ optimized: string;
37
+ original: string;
38
+ report: OptimizationReport;
39
+ }
40
+ export interface OptimizeOptions {
41
+ safety?: SafetyLevel;
42
+ tokenCounter?: (text: string) => number;
43
+ }
44
+ export interface Optimizer {
45
+ optimize(input: string): OptimizationResult;
46
+ analyze(input: string): OptimizationReport;
47
+ }
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,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAA;AAE5D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,kBAAkB,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CACxC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAA;IAC3C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAA;CAC3C"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "prompt-optimize",
3
+ "version": "0.1.0",
4
+ "description": "Compress prompts to use fewer tokens via deterministic heuristics",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "test": "vitest run",
13
+ "lint": "eslint src/",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "prompt",
18
+ "token",
19
+ "optimize",
20
+ "llm",
21
+ "ai"
22
+ ],
23
+ "author": "",
24
+ "license": "MIT",
25
+ "engines": {
26
+ "node": ">=18"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^25.5.0",
33
+ "@typescript-eslint/eslint-plugin": "^8.57.1",
34
+ "@typescript-eslint/parser": "^8.57.1",
35
+ "eslint": "^10.1.0",
36
+ "typescript": "^5.9.3",
37
+ "vitest": "^4.1.0"
38
+ }
39
+ }