@sliday/tamp 0.2.5 → 0.2.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.
Files changed (3) hide show
  1. package/bin/tamp.js +3 -2
  2. package/index.js +19 -3
  3. package/package.json +3 -2
package/bin/tamp.js CHANGED
@@ -1,12 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createProxy } from '../index.js'
3
- import { existsSync } from 'node:fs'
3
+ import { existsSync, readFileSync } from 'node:fs'
4
4
  import { spawn } from 'node:child_process'
5
5
  import { fileURLToPath } from 'node:url'
6
6
  import { dirname, join } from 'node:path'
7
7
 
8
8
  const __dirname = dirname(fileURLToPath(import.meta.url))
9
9
  const root = join(__dirname, '..')
10
+ const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf-8'))
10
11
 
11
12
  // ANSI colors
12
13
  const c = {
@@ -28,7 +29,7 @@ function printBanner(config) {
28
29
  const url = `http://localhost:${config.port}`
29
30
 
30
31
  log('')
31
- log(` ${c.bold}${c.cyan}┌─ Tamp ─────────────────────────────────┐${c.reset}`)
32
+ log(` ${c.bold}${c.cyan}┌─ Tamp ${c.dim}v${pkg.version}${c.reset}${c.bold}${c.cyan} ───────────────────────────────┐${c.reset}`)
32
33
  log(` ${c.cyan}│${c.reset} Proxy: ${c.bold}${c.green}${url}${c.reset}${c.cyan} │${c.reset}`)
33
34
  log(` ${c.cyan}│${c.reset} Status: ${c.bgGreen}${c.bold} ● READY ${c.reset}${c.cyan} │${c.reset}`)
34
35
  log(` ${c.cyan}│${c.reset} ${c.cyan}│${c.reset}`)
package/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import http from 'node:http'
2
2
  import https from 'node:https'
3
3
  import zlib from 'node:zlib'
4
+ import * as fzstd from 'fzstd'
4
5
  import { loadConfig } from './config.js'
5
6
  import { compressRequest } from './compress.js'
6
7
  import { detectProvider } from './providers.js'
@@ -139,21 +140,36 @@ return http.createServer(async (req, res) => {
139
140
  const headers = { ...req.headers }
140
141
  delete headers.host
141
142
 
142
- // Decompress gzip/deflate/br if needed
143
+ // Decompress request body if content-encoding is set
143
144
  const encoding = (req.headers['content-encoding'] || '').toLowerCase()
144
145
  let textBody
146
+ let decompressed = false
145
147
  try {
146
148
  if (encoding === 'gzip') {
147
149
  textBody = zlib.gunzipSync(rawBody)
150
+ decompressed = true
148
151
  } else if (encoding === 'deflate') {
149
152
  textBody = zlib.inflateSync(rawBody)
153
+ decompressed = true
150
154
  } else if (encoding === 'br') {
151
155
  textBody = zlib.brotliDecompressSync(rawBody)
156
+ decompressed = true
157
+ } else if (encoding === 'zstd') {
158
+ textBody = Buffer.from(fzstd.decompress(new Uint8Array(rawBody)))
159
+ decompressed = true
160
+ } else if (encoding && encoding !== 'identity') {
161
+ // Unknown encoding — can't decompress, passthrough as-is
162
+ if (config.log) console.error(`[tamp] passthrough (unsupported encoding: ${encoding})`)
163
+ forwardRequest(req.method, upstreamUrl, headers, rawBody, res)
164
+ return
152
165
  } else {
153
166
  textBody = rawBody
154
167
  }
155
168
  } catch {
156
- textBody = rawBody
169
+ // Decompression failed — passthrough original body
170
+ if (config.log) console.error(`[tamp] passthrough (decompression failed)`)
171
+ forwardRequest(req.method, upstreamUrl, headers, rawBody, res)
172
+ return
157
173
  }
158
174
 
159
175
  try {
@@ -161,7 +177,7 @@ return http.createServer(async (req, res) => {
161
177
  const { body, stats } = await compressRequest(parsed, config, provider)
162
178
  finalBody = Buffer.from(JSON.stringify(body), 'utf-8')
163
179
  // Send uncompressed — simpler and content-length is accurate
164
- delete headers['content-encoding']
180
+ if (decompressed) delete headers['content-encoding']
165
181
 
166
182
  if (config.log && stats.length) {
167
183
  session.record(stats)
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "providers.js",
10
10
  "stats.js"
11
11
  ],
12
- "version": "0.2.5",
12
+ "version": "0.2.6",
13
13
  "description": "Token compression proxy for coding agents. Works with Claude Code, Aider, Cursor, Cline, Windsurf. 33.9% fewer input tokens.",
14
14
  "type": "module",
15
15
  "main": "index.js",
@@ -39,6 +39,7 @@
39
39
  "homepage": "https://github.com/sliday/tamp",
40
40
  "dependencies": {
41
41
  "@anthropic-ai/tokenizer": "^0.0.4",
42
- "@toon-format/toon": "^2.1.0"
42
+ "@toon-format/toon": "^2.1.0",
43
+ "fzstd": "^0.1.1"
43
44
  }
44
45
  }