@curatedmcp/tokenshield 0.2.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 (55) hide show
  1. package/dist/cli.d.ts +2 -0
  2. package/dist/cli.js +238 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/commands/bench.d.ts +5 -0
  5. package/dist/commands/bench.js +191 -0
  6. package/dist/commands/bench.js.map +1 -0
  7. package/dist/commands/demo.d.ts +3 -0
  8. package/dist/commands/demo.js +99 -0
  9. package/dist/commands/demo.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +1 -0
  11. package/dist/commands/doctor.js +119 -0
  12. package/dist/commands/doctor.js.map +1 -0
  13. package/dist/commands/estimate.d.ts +3 -0
  14. package/dist/commands/estimate.js +90 -0
  15. package/dist/commands/estimate.js.map +1 -0
  16. package/dist/commands/integrations.d.ts +14 -0
  17. package/dist/commands/integrations.js +138 -0
  18. package/dist/commands/integrations.js.map +1 -0
  19. package/dist/commands/logs.d.ts +6 -0
  20. package/dist/commands/logs.js +66 -0
  21. package/dist/commands/logs.js.map +1 -0
  22. package/dist/commands/setup.d.ts +9 -0
  23. package/dist/commands/setup.js +159 -0
  24. package/dist/commands/setup.js.map +1 -0
  25. package/dist/commands/status.d.ts +1 -0
  26. package/dist/commands/status.js +102 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/stop.d.ts +1 -0
  29. package/dist/commands/stop.js +27 -0
  30. package/dist/commands/stop.js.map +1 -0
  31. package/dist/commands/up.d.ts +15 -0
  32. package/dist/commands/up.js +145 -0
  33. package/dist/commands/up.js.map +1 -0
  34. package/dist/dashboard.d.ts +4 -0
  35. package/dist/dashboard.js +186 -0
  36. package/dist/dashboard.js.map +1 -0
  37. package/dist/lib/daemon.d.ts +23 -0
  38. package/dist/lib/daemon.js +164 -0
  39. package/dist/lib/daemon.js.map +1 -0
  40. package/dist/lib/errors.d.ts +23 -0
  41. package/dist/lib/errors.js +131 -0
  42. package/dist/lib/errors.js.map +1 -0
  43. package/dist/lib/integrations.d.ts +47 -0
  44. package/dist/lib/integrations.js +210 -0
  45. package/dist/lib/integrations.js.map +1 -0
  46. package/dist/lib/paths.d.ts +5 -0
  47. package/dist/lib/paths.js +18 -0
  48. package/dist/lib/paths.js.map +1 -0
  49. package/dist/lib/preflight.d.ts +20 -0
  50. package/dist/lib/preflight.js +97 -0
  51. package/dist/lib/preflight.js.map +1 -0
  52. package/dist/lib/ui.d.ts +68 -0
  53. package/dist/lib/ui.js +221 -0
  54. package/dist/lib/ui.js.map +1 -0
  55. package/package.json +44 -0
@@ -0,0 +1,97 @@
1
+ import { createServer } from "node:net";
2
+ import { request as httpsRequest } from "node:https";
3
+ import { request as httpRequest } from "node:http";
4
+ import { URL } from "node:url";
5
+ import { TokenShieldError } from "./errors.js";
6
+ export function checkPort(port, host = "127.0.0.1") {
7
+ return new Promise((resolve) => {
8
+ const server = createServer();
9
+ server.once("error", (err) => {
10
+ resolve({
11
+ port,
12
+ available: false,
13
+ detail: err.code === "EADDRINUSE" ? "address in use" : err.message,
14
+ });
15
+ });
16
+ server.once("listening", () => {
17
+ server.close(() => resolve({ port, available: true }));
18
+ });
19
+ server.listen(port, host);
20
+ });
21
+ }
22
+ export function probeUpstream(baseUrl, timeoutMs = 5000) {
23
+ return new Promise((resolve) => {
24
+ let parsed;
25
+ try {
26
+ parsed = new URL("/v1/messages", baseUrl);
27
+ }
28
+ catch (err) {
29
+ resolve({
30
+ url: baseUrl,
31
+ reachable: false,
32
+ detail: `invalid URL: ${err.message}`,
33
+ });
34
+ return;
35
+ }
36
+ const requester = parsed.protocol === "https:" ? httpsRequest : httpRequest;
37
+ const startedAt = Date.now();
38
+ const req = requester({
39
+ method: "POST",
40
+ hostname: parsed.hostname,
41
+ port: parsed.port || (parsed.protocol === "https:" ? 443 : 80),
42
+ path: parsed.pathname,
43
+ headers: { "content-type": "application/json", "content-length": "2" },
44
+ timeout: timeoutMs,
45
+ }, (res) => {
46
+ res.resume();
47
+ const latencyMs = Date.now() - startedAt;
48
+ // Any 4xx/5xx is fine — proves the host is reachable & responding
49
+ resolve({
50
+ url: baseUrl,
51
+ reachable: true,
52
+ latencyMs,
53
+ status: res.statusCode ?? 0,
54
+ });
55
+ });
56
+ req.on("timeout", () => {
57
+ req.destroy();
58
+ resolve({ url: baseUrl, reachable: false, detail: `timed out after ${timeoutMs}ms` });
59
+ });
60
+ req.on("error", (err) => {
61
+ resolve({ url: baseUrl, reachable: false, detail: err.message });
62
+ });
63
+ req.write("{}");
64
+ req.end();
65
+ });
66
+ }
67
+ export function classifyApiKey(value) {
68
+ if (!value || value.length === 0) {
69
+ return {
70
+ state: "missing",
71
+ hint: "Set ANTHROPIC_API_KEY in the shell that runs Claude Code, NOT where you run tokenshield",
72
+ };
73
+ }
74
+ if (!value.startsWith("sk-ant-")) {
75
+ return {
76
+ state: "wrong_prefix",
77
+ hint: "Anthropic keys start with sk-ant- — make sure you copied the right key",
78
+ };
79
+ }
80
+ return { state: "ok" };
81
+ }
82
+ /** Throws a structured error if the port is in use. */
83
+ export async function requirePortFree(port, label) {
84
+ const r = await checkPort(port);
85
+ if (!r.available) {
86
+ throw new TokenShieldError({
87
+ code: "PORT_IN_USE",
88
+ message: `Port ${port} (${label}) is already in use`,
89
+ hint: r.detail,
90
+ nextSteps: [
91
+ `lsof -nP -iTCP:${port} -sTCP:LISTEN # see what's using it`,
92
+ `tokenshield up --port <free-port> # or pick a different port`,
93
+ ],
94
+ });
95
+ }
96
+ }
97
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/lib/preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export declare const c: {
2
+ reset: string;
3
+ bold: (s: string) => string;
4
+ dim: (s: string) => string;
5
+ italic: (s: string) => string;
6
+ underline: (s: string) => string;
7
+ inverse: (s: string) => string;
8
+ black: (s: string) => string;
9
+ red: (s: string) => string;
10
+ green: (s: string) => string;
11
+ yellow: (s: string) => string;
12
+ blue: (s: string) => string;
13
+ magenta: (s: string) => string;
14
+ cyan: (s: string) => string;
15
+ white: (s: string) => string;
16
+ gray: (s: string) => string;
17
+ brightGreen: (s: string) => string;
18
+ brightYellow: (s: string) => string;
19
+ brightCyan: (s: string) => string;
20
+ };
21
+ export declare function stripAnsi(s: string): string;
22
+ export declare function link(text: string, url: string): string;
23
+ export declare const sym: {
24
+ check: string;
25
+ cross: string;
26
+ warn: string;
27
+ info: string;
28
+ arrow: string;
29
+ bullet: string;
30
+ dot: string;
31
+ spinner: string[];
32
+ };
33
+ export declare function indent(text: string, n: number): string;
34
+ export declare function wrapText(text: string, width: number): string[];
35
+ export interface BoxOptions {
36
+ title?: string;
37
+ padding?: number;
38
+ width?: number;
39
+ color?: (s: string) => string;
40
+ }
41
+ export declare function box(content: string, opts?: BoxOptions): string;
42
+ export declare function spinner(label: string): {
43
+ tick: (newLabel?: string) => void;
44
+ succeed: (final?: string) => void;
45
+ fail: (final?: string) => void;
46
+ stop: () => void;
47
+ };
48
+ export declare function table(rows: string[][], opts?: {
49
+ header?: string[];
50
+ pad?: number;
51
+ }): string;
52
+ export interface OutputOptions {
53
+ quiet: boolean;
54
+ debug: boolean;
55
+ json: boolean;
56
+ }
57
+ export declare function setOutputMode(next: Partial<OutputOptions>): void;
58
+ export declare function isQuiet(): boolean;
59
+ export declare function isDebug(): boolean;
60
+ export declare function isJson(): boolean;
61
+ export declare function say(s: string): void;
62
+ export declare function emit(s: string): void;
63
+ export declare function emitJson(obj: unknown): void;
64
+ export declare function warn(s: string): void;
65
+ export declare function debug(s: string): void;
66
+ export declare function errorLine(s: string): void;
67
+ export declare function heading(s: string): void;
68
+ export declare function dim(s: string): string;
package/dist/lib/ui.js ADDED
@@ -0,0 +1,221 @@
1
+ // Lightweight UI primitives. No dependencies — just ANSI escapes.
2
+ // Honors NO_COLOR, TERM=dumb, and non-TTY output (CI, pipes).
3
+ const RAW_FORCE_COLOR = process.env["FORCE_COLOR"];
4
+ const RAW_NO_COLOR = process.env["NO_COLOR"];
5
+ const RAW_TERM = process.env["TERM"];
6
+ function shouldUseColor(stream) {
7
+ if (RAW_FORCE_COLOR && RAW_FORCE_COLOR !== "0" && RAW_FORCE_COLOR !== "false")
8
+ return true;
9
+ if (RAW_NO_COLOR !== undefined && RAW_NO_COLOR !== "")
10
+ return false;
11
+ if (RAW_TERM === "dumb")
12
+ return false;
13
+ return Boolean(stream.isTTY);
14
+ }
15
+ const STDOUT_COLOR = shouldUseColor(process.stdout);
16
+ const STDERR_COLOR = shouldUseColor(process.stderr);
17
+ function wrap(open, close) {
18
+ return (s) => (STDOUT_COLOR ? `\x1b[${open}m${s}\x1b[${close}m` : s);
19
+ }
20
+ export const c = {
21
+ reset: "\x1b[0m",
22
+ bold: wrap("1", "22"),
23
+ dim: wrap("2", "22"),
24
+ italic: wrap("3", "23"),
25
+ underline: wrap("4", "24"),
26
+ inverse: wrap("7", "27"),
27
+ black: wrap("30", "39"),
28
+ red: wrap("31", "39"),
29
+ green: wrap("32", "39"),
30
+ yellow: wrap("33", "39"),
31
+ blue: wrap("34", "39"),
32
+ magenta: wrap("35", "39"),
33
+ cyan: wrap("36", "39"),
34
+ white: wrap("37", "39"),
35
+ gray: wrap("90", "39"),
36
+ brightGreen: wrap("92", "39"),
37
+ brightYellow: wrap("93", "39"),
38
+ brightCyan: wrap("96", "39"),
39
+ };
40
+ export function stripAnsi(s) {
41
+ return s.replace(
42
+ // eslint-disable-next-line no-control-regex
43
+ /[›][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g, "");
44
+ }
45
+ // OSC 8 hyperlink — supported by iTerm2, Kitty, modern VSCode terminal, Wezterm, etc.
46
+ // Falls back to plain text + the URL in parens for terminals that don't render.
47
+ const HYPERLINK_OK = STDOUT_COLOR &&
48
+ // crude allow-list; safer to assume unsupported than break the layout
49
+ (process.env["TERM_PROGRAM"] === "iTerm.app" ||
50
+ process.env["TERM_PROGRAM"] === "WezTerm" ||
51
+ process.env["TERM_PROGRAM"] === "vscode" ||
52
+ process.env["KITTY_WINDOW_ID"] !== undefined ||
53
+ process.env["WT_SESSION"] !== undefined);
54
+ export function link(text, url) {
55
+ if (HYPERLINK_OK) {
56
+ return `\x1b]8;;${url}\x1b\\${text}\x1b]8;;\x1b\\`;
57
+ }
58
+ return text === url ? text : `${text} (${url})`;
59
+ }
60
+ export const sym = {
61
+ check: STDOUT_COLOR ? c.green("✔") : "ok",
62
+ cross: STDOUT_COLOR ? c.red("✗") : "x",
63
+ warn: STDOUT_COLOR ? c.yellow("⚠") : "!",
64
+ info: STDOUT_COLOR ? c.cyan("ℹ") : "i",
65
+ arrow: STDOUT_COLOR ? c.gray("→") : "->",
66
+ bullet: STDOUT_COLOR ? c.gray("•") : "*",
67
+ dot: STDOUT_COLOR ? c.green("●") : "*",
68
+ spinner: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
69
+ };
70
+ export function indent(text, n) {
71
+ const pad = " ".repeat(n);
72
+ return text
73
+ .split("\n")
74
+ .map((l) => (l.length > 0 ? pad + l : l))
75
+ .join("\n");
76
+ }
77
+ export function wrapText(text, width) {
78
+ const lines = [];
79
+ for (const para of text.split("\n")) {
80
+ if (para === "") {
81
+ lines.push("");
82
+ continue;
83
+ }
84
+ let current = "";
85
+ for (const word of para.split(/\s+/)) {
86
+ if (current.length === 0) {
87
+ current = word;
88
+ }
89
+ else if (current.length + word.length + 1 <= width) {
90
+ current += " " + word;
91
+ }
92
+ else {
93
+ lines.push(current);
94
+ current = word;
95
+ }
96
+ }
97
+ if (current.length > 0)
98
+ lines.push(current);
99
+ }
100
+ return lines;
101
+ }
102
+ export function box(content, opts = {}) {
103
+ const pad = opts.padding ?? 1;
104
+ const color = opts.color ?? c.gray;
105
+ const lines = content.split("\n");
106
+ const longest = Math.max(opts.title ? stripAnsi(opts.title).length + 2 : 0, ...lines.map((l) => stripAnsi(l).length));
107
+ const innerWidth = (opts.width ?? longest) + pad * 2;
108
+ const top = opts.title
109
+ ? color("┌─ ") + c.bold(opts.title) + " " + color("─".repeat(Math.max(0, innerWidth - stripAnsi(opts.title).length - 4))) + color("┐")
110
+ : color("┌" + "─".repeat(innerWidth) + "┐");
111
+ const bottom = color("└" + "─".repeat(innerWidth) + "┘");
112
+ const padded = lines.map((l) => {
113
+ const visibleLen = stripAnsi(l).length;
114
+ const right = " ".repeat(Math.max(0, innerWidth - pad * 2 - visibleLen));
115
+ return color("│") + " ".repeat(pad) + l + right + " ".repeat(pad) + color("│");
116
+ });
117
+ return [top, ...padded, bottom].join("\n");
118
+ }
119
+ // Tiny live-updating spinner. Use only on TTY; on non-TTY it just prints the label once.
120
+ export function spinner(label) {
121
+ if (!process.stdout.isTTY) {
122
+ process.stdout.write(label + "\n");
123
+ return { tick: () => { }, succeed: () => { }, fail: () => { }, stop: () => { } };
124
+ }
125
+ let frame = 0;
126
+ let current = label;
127
+ let active = true;
128
+ const draw = () => {
129
+ if (!active)
130
+ return;
131
+ const ch = sym.spinner[frame % sym.spinner.length];
132
+ process.stdout.write(`\r${c.cyan(ch)} ${current} \x1b[K`);
133
+ frame++;
134
+ };
135
+ const interval = setInterval(draw, 80);
136
+ draw();
137
+ return {
138
+ tick: (newLabel) => {
139
+ if (newLabel !== undefined)
140
+ current = newLabel;
141
+ },
142
+ succeed: (final) => {
143
+ active = false;
144
+ clearInterval(interval);
145
+ process.stdout.write(`\r${sym.check} ${final ?? current} \x1b[K\n`);
146
+ },
147
+ fail: (final) => {
148
+ active = false;
149
+ clearInterval(interval);
150
+ process.stdout.write(`\r${sym.cross} ${final ?? current} \x1b[K\n`);
151
+ },
152
+ stop: () => {
153
+ active = false;
154
+ clearInterval(interval);
155
+ process.stdout.write("\r\x1b[K");
156
+ },
157
+ };
158
+ }
159
+ export function table(rows, opts = {}) {
160
+ const all = opts.header ? [opts.header, ...rows] : rows;
161
+ const cols = Math.max(...all.map((r) => r.length));
162
+ const widths = [];
163
+ for (let i = 0; i < cols; i++) {
164
+ widths.push(Math.max(...all.map((r) => stripAnsi(r[i] ?? "").length)));
165
+ }
166
+ const pad = opts.pad ?? 2;
167
+ const fmt = (r) => r
168
+ .map((cell, i) => {
169
+ const w = widths[i] ?? 0;
170
+ const visible = stripAnsi(cell).length;
171
+ return cell + " ".repeat(Math.max(0, w - visible));
172
+ })
173
+ .join(" ".repeat(pad));
174
+ const out = [];
175
+ if (opts.header) {
176
+ out.push(c.gray(c.bold(fmt(opts.header))));
177
+ }
178
+ for (const r of rows)
179
+ out.push(fmt(r));
180
+ return out.join("\n");
181
+ }
182
+ let opts = { quiet: false, debug: false, json: false };
183
+ export function setOutputMode(next) {
184
+ opts = { ...opts, ...next };
185
+ }
186
+ export function isQuiet() { return opts.quiet; }
187
+ export function isDebug() { return opts.debug; }
188
+ export function isJson() { return opts.json; }
189
+ export function say(s) {
190
+ if (opts.json || opts.quiet)
191
+ return;
192
+ process.stdout.write(s.endsWith("\n") ? s : s + "\n");
193
+ }
194
+ export function emit(s) {
195
+ // Always print, even in quiet — for command output that user explicitly asked for
196
+ if (opts.json)
197
+ return;
198
+ process.stdout.write(s.endsWith("\n") ? s : s + "\n");
199
+ }
200
+ export function emitJson(obj) {
201
+ process.stdout.write(JSON.stringify(obj, null, 2) + "\n");
202
+ }
203
+ export function warn(s) {
204
+ if (opts.json)
205
+ return;
206
+ const line = STDERR_COLOR ? `${sym.warn} ${s}` : `WARN: ${s}`;
207
+ process.stderr.write(line + "\n");
208
+ }
209
+ export function debug(s) {
210
+ if (!opts.debug || opts.json)
211
+ return;
212
+ process.stderr.write(c.gray(`[debug] ${s}`) + "\n");
213
+ }
214
+ export function errorLine(s) {
215
+ const line = STDERR_COLOR ? `${sym.cross} ${c.red(s)}` : `ERROR: ${s}`;
216
+ process.stderr.write(line + "\n");
217
+ }
218
+ // Convenience headings used by command output
219
+ export function heading(s) { say("\n" + c.bold(s) + "\n"); }
220
+ export function dim(s) { return c.dim(s); }
221
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/lib/ui.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@curatedmcp/tokenshield",
3
+ "version": "0.2.0",
4
+ "description": "TokenShield CLI — cut your Claude Code bill 40–70%. Local proxy. Your API key never leaves your machine.",
5
+ "type": "module",
6
+ "bin": {
7
+ "tokenshield": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/cli.js",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "test": "tsc -p tsconfig.test.json && node --enable-source-maps --test $(find dist-test/test -name '*.test.js')",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "claude",
21
+ "claude-code",
22
+ "anthropic",
23
+ "proxy",
24
+ "token-cost",
25
+ "savings",
26
+ "curatedmcp"
27
+ ],
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/oneprofile-dev/tokenshield"
31
+ },
32
+ "license": "MIT",
33
+ "dependencies": {
34
+ "@curatedmcp/tokenshield-core": "^0.2.0",
35
+ "commander": "^12.0.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^22.0.0",
39
+ "typescript": "^5.5.0"
40
+ },
41
+ "engines": {
42
+ "node": ">=22.0.0"
43
+ }
44
+ }