@solongate/proxy 0.1.6 → 0.1.7

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/dist/create.js CHANGED
@@ -4,9 +4,66 @@
4
4
  import { mkdirSync, writeFileSync, existsSync } from "fs";
5
5
  import { resolve, join } from "path";
6
6
  import { execSync } from "child_process";
7
+ var c = {
8
+ reset: "\x1B[0m",
9
+ bold: "\x1B[1m",
10
+ dim: "\x1B[2m",
11
+ italic: "\x1B[3m",
12
+ white: "\x1B[97m",
13
+ gray: "\x1B[90m",
14
+ blue1: "\x1B[38;2;20;50;160m",
15
+ blue2: "\x1B[38;2;40;80;190m",
16
+ blue3: "\x1B[38;2;60;110;215m",
17
+ blue4: "\x1B[38;2;90;140;230m",
18
+ blue5: "\x1B[38;2;130;170;240m",
19
+ blue6: "\x1B[38;2;170;200;250m",
20
+ green: "\x1B[38;2;80;200;120m",
21
+ red: "\x1B[38;2;220;80;80m",
22
+ cyan: "\x1B[38;2;100;200;220m",
23
+ yellow: "\x1B[38;2;220;200;80m",
24
+ bgBlue: "\x1B[48;2;20;50;160m"
25
+ };
7
26
  function log(msg) {
8
27
  process.stderr.write(msg + "\n");
9
28
  }
29
+ function printBanner(subtitle) {
30
+ const lines = [
31
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
32
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
33
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
34
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
35
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
36
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
37
+ ];
38
+ const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5, c.blue6];
39
+ log("");
40
+ for (let i = 0; i < lines.length; i++) {
41
+ log(`${c.bold}${colors[i]}${lines[i]}${c.reset}`);
42
+ }
43
+ log("");
44
+ log(` ${c.dim}${c.italic}${subtitle}${c.reset}`);
45
+ log("");
46
+ }
47
+ function withSpinner(message, fn) {
48
+ const frames = ["\u28FE", "\u28FD", "\u28FB", "\u28BF", "\u287F", "\u28DF", "\u28EF", "\u28F7"];
49
+ let i = 0;
50
+ const id = setInterval(() => {
51
+ const color = i % 2 === 0 ? c.blue3 : c.blue5;
52
+ process.stderr.write(`\r ${color}${frames[i++ % frames.length]}${c.reset} ${c.dim}${message}${c.reset}`);
53
+ }, 80);
54
+ try {
55
+ const result = fn();
56
+ clearInterval(id);
57
+ process.stderr.write(`\r ${c.green}\u2713${c.reset} ${message}${" ".repeat(20)}
58
+ `);
59
+ return result;
60
+ } catch (err) {
61
+ clearInterval(id);
62
+ process.stderr.write(`\r ${c.red}\u2717${c.reset} ${message} \u2014 failed${" ".repeat(10)}
63
+ `);
64
+ throw err;
65
+ }
66
+ }
10
67
  function parseCreateArgs(argv) {
11
68
  const args = argv.slice(2);
12
69
  const opts = {
@@ -190,99 +247,53 @@ dist/
190
247
  `
191
248
  );
192
249
  }
193
- var c = {
194
- reset: "\x1B[0m",
195
- bold: "\x1B[1m",
196
- dim: "\x1B[2m",
197
- white: "\x1B[97m",
198
- blue1: "\x1B[38;2;30;64;175m",
199
- // dark blue
200
- blue2: "\x1B[38;2;50;100;200m",
201
- blue3: "\x1B[38;2;80;140;220m",
202
- blue4: "\x1B[38;2;120;170;235m",
203
- blue5: "\x1B[38;2;170;200;245m",
204
- // light blue → white
205
- green: "\x1B[32m",
206
- red: "\x1B[31m"
207
- };
208
- function printBanner(subtitle) {
209
- const lines = [
210
- " ______ ______ __ ______ __ __ ______ ______ ______ ______ ",
211
- '/\\ ___\\ /\\ __ \\ /\\ \\ /\\ __ \\ /\\ "-.\\ \\ /\\ ___\\ /\\ __ \\ /\\__ _\\ /\\ ___\\ ',
212
- "\\ \\___ \\ \\ \\ \\/\\ \\ \\ \\ \\____ \\ \\ \\/\\ \\ \\ \\ \\-. \\ \\ \\ \\__ \\ \\ \\ __ \\ \\/_/\\ \\/ \\ \\ __\\ ",
213
- ' \\/\\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_\\\\"\\_\\ \\ \\_____\\ \\ \\_\\ \\_\\ \\ \\_\\ \\ \\_____\\',
214
- " \\/_____/ \\/_____/ \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_/\\/_/ \\/_/ \\/_____/"
215
- ];
216
- const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5];
217
- log("");
218
- for (let i = 0; i < lines.length; i++) {
219
- log(`${c.bold}${colors[i]}${lines[i]}${c.reset}`);
220
- }
221
- log("");
222
- log(` ${c.dim}${subtitle}${c.reset}`);
223
- log("");
224
- }
225
- function withSpinner(message, fn) {
226
- const frames = ["\u28FE", "\u28FD", "\u28FB", "\u28BF", "\u287F", "\u28DF", "\u28EF", "\u28F7"];
227
- let i = 0;
228
- const id = setInterval(() => {
229
- process.stderr.write(`\r ${c.blue3}${frames[i++ % frames.length]}${c.reset} ${message}`);
230
- }, 80);
231
- try {
232
- fn();
233
- clearInterval(id);
234
- process.stderr.write(`\r ${c.green}\u2713${c.reset} ${message}
235
- `);
236
- } catch {
237
- clearInterval(id);
238
- process.stderr.write(`\r ${c.red}\u2717${c.reset} ${message} \u2014 failed
239
- `);
240
- }
241
- }
242
- function installDeps(dir) {
243
- withSpinner("Installing dependencies...", () => {
244
- execSync("npm install", { cwd: dir, stdio: "pipe" });
245
- });
246
- }
247
250
  async function main() {
248
251
  const opts = parseCreateArgs(process.argv);
249
252
  const dir = resolve(opts.name);
250
253
  printBanner("Create MCP Server");
251
254
  if (existsSync(dir)) {
252
- log(` Error: Directory "${opts.name}" already exists.`);
255
+ log(` ${c.red}Error:${c.reset} Directory "${opts.name}" already exists.`);
253
256
  process.exit(1);
254
257
  }
255
- mkdirSync(dir, { recursive: true });
256
- log(` Project: ${opts.name}`);
257
- log(` Language: TypeScript`);
258
- log(` Policy: ${opts.policy}`);
259
- log("");
260
- createProject(dir, opts.name, opts.policy);
261
- log(" Files created:");
262
- log(" package.json");
263
- log(" tsconfig.json");
264
- log(" src/index.ts");
265
- log(" .mcp.json");
266
- log(" .gitignore");
258
+ log(` ${c.blue3}Project${c.reset} ${c.bold}${opts.name}${c.reset}`);
259
+ log(` ${c.blue3}Language${c.reset} TypeScript`);
260
+ log(` ${c.blue3}Policy${c.reset} ${opts.policy}`);
267
261
  log("");
262
+ withSpinner("Scaffolding project files...", () => {
263
+ mkdirSync(dir, { recursive: true });
264
+ createProject(dir, opts.name, opts.policy);
265
+ });
268
266
  if (!opts.noInstall) {
269
- installDeps(dir);
270
- log("");
267
+ withSpinner("Installing dependencies...", () => {
268
+ execSync("npm install", { cwd: dir, stdio: "pipe" });
269
+ });
271
270
  }
272
- const W = 46;
273
- const line = (s) => log(` \u2502 ${s.padEnd(W)} \u2502`);
274
- log(` \u250C${"\u2500".repeat(W + 2)}\u2510`);
275
- line("Project created!");
276
- line("");
277
- line(`cd ${opts.name}`);
278
- line("");
279
- line("npm run build # Build");
280
- line("npm run dev # Dev mode (tsx)");
281
- line("npm start # Run built server");
282
- line("");
283
- line("Set your API key:");
284
- line("export SOLONGATE_API_KEY=sg_live_xxx");
285
- log(` \u2514${"\u2500".repeat(W + 2)}\u2518`);
271
+ log("");
272
+ const W = 52;
273
+ const hr = "\u2500".repeat(W);
274
+ const pad = (s) => s.padEnd(W);
275
+ const bLine = (s) => log(` ${c.dim}\u2502${c.reset} ${pad(s)} ${c.dim}\u2502${c.reset}`);
276
+ const bEmpty = () => bLine("");
277
+ log(` ${c.dim}\u256D${hr}\u256E${c.reset}`);
278
+ log(` ${c.dim}\u2502${c.reset} ${c.green}${c.bold}${"\u2714 Project created successfully!".padEnd(W)}${c.reset} ${c.dim}\u2502${c.reset}`);
279
+ log(` ${c.dim}\u251C${hr}\u2524${c.reset}`);
280
+ bEmpty();
281
+ bLine(`${c.yellow}Next steps:${c.reset}`);
282
+ bEmpty();
283
+ bLine(` ${c.cyan}$${c.reset} cd ${c.bold}${opts.name}${c.reset}`);
284
+ bLine(` ${c.cyan}$${c.reset} npm run build`);
285
+ bLine(` ${c.cyan}$${c.reset} npm run dev ${c.dim}# dev mode${c.reset}`);
286
+ bLine(` ${c.cyan}$${c.reset} npm start ${c.dim}# production${c.reset}`);
287
+ bEmpty();
288
+ log(` ${c.dim}\u251C${hr}\u2524${c.reset}`);
289
+ bEmpty();
290
+ bLine(`${c.yellow}Set your API key:${c.reset}`);
291
+ bEmpty();
292
+ bLine(` ${c.cyan}$${c.reset} export SOLONGATE_API_KEY=${c.blue3}sg_live_xxx${c.reset}`);
293
+ bEmpty();
294
+ bLine(`${c.dim}Get your key at ${c.blue4}https://solongate.com${c.reset}`);
295
+ bEmpty();
296
+ log(` ${c.dim}\u2570${hr}\u256F${c.reset}`);
286
297
  log("");
287
298
  }
288
299
  main().catch((err) => {
package/dist/index.js CHANGED
@@ -147,26 +147,29 @@ async function main() {
147
147
  reset: "\x1B[0m",
148
148
  bold: "\x1B[1m",
149
149
  dim: "\x1B[2m",
150
- blue1: "\x1B[38;2;30;64;175m",
151
- blue2: "\x1B[38;2;50;100;200m",
152
- blue3: "\x1B[38;2;80;140;220m",
153
- blue4: "\x1B[38;2;120;170;235m",
154
- blue5: "\x1B[38;2;170;200;245m"
150
+ italic: "\x1B[3m",
151
+ blue1: "\x1B[38;2;20;50;160m",
152
+ blue2: "\x1B[38;2;40;80;190m",
153
+ blue3: "\x1B[38;2;60;110;215m",
154
+ blue4: "\x1B[38;2;90;140;230m",
155
+ blue5: "\x1B[38;2;130;170;240m",
156
+ blue6: "\x1B[38;2;170;200;250m"
155
157
  };
156
158
  const bannerLines = [
157
- " ______ ______ __ ______ __ __ ______ ______ ______ ______ ",
158
- '/\\ ___\\ /\\ __ \\ /\\ \\ /\\ __ \\ /\\ "-.\\ \\ /\\ ___\\ /\\ __ \\ /\\__ _\\ /\\ ___\\ ',
159
- "\\ \\___ \\ \\ \\ \\/\\ \\ \\ \\ \\____ \\ \\ \\/\\ \\ \\ \\ \\-. \\ \\ \\ \\__ \\ \\ \\ __ \\ \\/_/\\ \\/ \\ \\ __\\ ",
160
- ' \\/\\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_\\\\"\\_\\ \\ \\_____\\ \\ \\_\\ \\_\\ \\ \\_\\ \\ \\_____\\',
161
- " \\/_____/ \\/_____/ \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_/\\/_/ \\/_/ \\/_____/"
159
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
160
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
161
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
162
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
163
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
164
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
162
165
  ];
163
- const bannerColors = [_c.blue1, _c.blue2, _c.blue3, _c.blue4, _c.blue5];
166
+ const bannerColors = [_c.blue1, _c.blue2, _c.blue3, _c.blue4, _c.blue5, _c.blue6];
164
167
  console.error("");
165
168
  for (let i = 0; i < bannerLines.length; i++) {
166
169
  console.error(`${_c.bold}${bannerColors[i]}${bannerLines[i]}${_c.reset}`);
167
170
  }
168
171
  console.error("");
169
- console.error(` ${_c.dim}Init Setup${_c.reset}`);
172
+ console.error(` ${_c.dim}${_c.italic}Init Setup${_c.reset}`);
170
173
  console.error("");
171
174
  const configInfo = findConfigFile(options.configPath);
172
175
  if (!configInfo) {
@@ -368,19 +371,20 @@ function log2(msg) {
368
371
  }
369
372
  function printBanner(subtitle) {
370
373
  const lines = [
371
- " ______ ______ __ ______ __ __ ______ ______ ______ ______ ",
372
- '/\\ ___\\ /\\ __ \\ /\\ \\ /\\ __ \\ /\\ "-.\\ \\ /\\ ___\\ /\\ __ \\ /\\__ _\\ /\\ ___\\ ',
373
- "\\ \\___ \\ \\ \\ \\/\\ \\ \\ \\ \\____ \\ \\ \\/\\ \\ \\ \\ \\-. \\ \\ \\ \\__ \\ \\ \\ __ \\ \\/_/\\ \\/ \\ \\ __\\ ",
374
- ' \\/\\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_\\\\"\\_\\ \\ \\_____\\ \\ \\_\\ \\_\\ \\ \\_\\ \\ \\_____\\',
375
- " \\/_____/ \\/_____/ \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_/\\/_/ \\/_/ \\/_____/"
374
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
375
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
376
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
377
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
378
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
379
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
376
380
  ];
377
- const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5];
381
+ const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5, c.blue6];
378
382
  log2("");
379
383
  for (let i = 0; i < lines.length; i++) {
380
384
  log2(`${c.bold}${colors[i]}${lines[i]}${c.reset}`);
381
385
  }
382
386
  log2("");
383
- log2(` ${c.dim}${subtitle}${c.reset}`);
387
+ log2(` ${c.dim}${c.italic}${subtitle}${c.reset}`);
384
388
  log2("");
385
389
  }
386
390
  function detectProject() {
@@ -658,11 +662,15 @@ var init_inject = __esm({
658
662
  reset: "\x1B[0m",
659
663
  bold: "\x1B[1m",
660
664
  dim: "\x1B[2m",
661
- blue1: "\x1B[38;2;30;64;175m",
662
- blue2: "\x1B[38;2;50;100;200m",
663
- blue3: "\x1B[38;2;80;140;220m",
664
- blue4: "\x1B[38;2;120;170;235m",
665
- blue5: "\x1B[38;2;170;200;245m"
665
+ italic: "\x1B[3m",
666
+ green: "\x1B[38;2;80;200;120m",
667
+ red: "\x1B[38;2;220;80;80m",
668
+ blue1: "\x1B[38;2;20;50;160m",
669
+ blue2: "\x1B[38;2;40;80;190m",
670
+ blue3: "\x1B[38;2;60;110;215m",
671
+ blue4: "\x1B[38;2;90;140;230m",
672
+ blue5: "\x1B[38;2;130;170;240m",
673
+ blue6: "\x1B[38;2;170;200;250m"
666
674
  };
667
675
  main2().catch((err) => {
668
676
  log2(`Fatal: ${err instanceof Error ? err.message : String(err)}`);
@@ -679,6 +687,44 @@ import { execSync as execSync2 } from "child_process";
679
687
  function log3(msg) {
680
688
  process.stderr.write(msg + "\n");
681
689
  }
690
+ function printBanner2(subtitle) {
691
+ const lines = [
692
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
693
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
694
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
695
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
696
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
697
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
698
+ ];
699
+ const colors = [c2.blue1, c2.blue2, c2.blue3, c2.blue4, c2.blue5, c2.blue6];
700
+ log3("");
701
+ for (let i = 0; i < lines.length; i++) {
702
+ log3(`${c2.bold}${colors[i]}${lines[i]}${c2.reset}`);
703
+ }
704
+ log3("");
705
+ log3(` ${c2.dim}${c2.italic}${subtitle}${c2.reset}`);
706
+ log3("");
707
+ }
708
+ function withSpinner(message, fn) {
709
+ const frames = ["\u28FE", "\u28FD", "\u28FB", "\u28BF", "\u287F", "\u28DF", "\u28EF", "\u28F7"];
710
+ let i = 0;
711
+ const id = setInterval(() => {
712
+ const color = i % 2 === 0 ? c2.blue3 : c2.blue5;
713
+ process.stderr.write(`\r ${color}${frames[i++ % frames.length]}${c2.reset} ${c2.dim}${message}${c2.reset}`);
714
+ }, 80);
715
+ try {
716
+ const result = fn();
717
+ clearInterval(id);
718
+ process.stderr.write(`\r ${c2.green}\u2713${c2.reset} ${message}${" ".repeat(20)}
719
+ `);
720
+ return result;
721
+ } catch (err) {
722
+ clearInterval(id);
723
+ process.stderr.write(`\r ${c2.red}\u2717${c2.reset} ${message} \u2014 failed${" ".repeat(10)}
724
+ `);
725
+ throw err;
726
+ }
727
+ }
682
728
  function parseCreateArgs(argv) {
683
729
  const args = argv.slice(2);
684
730
  const opts = {
@@ -862,84 +908,53 @@ dist/
862
908
  `
863
909
  );
864
910
  }
865
- function printBanner2(subtitle) {
866
- const lines = [
867
- " ______ ______ __ ______ __ __ ______ ______ ______ ______ ",
868
- '/\\ ___\\ /\\ __ \\ /\\ \\ /\\ __ \\ /\\ "-.\\ \\ /\\ ___\\ /\\ __ \\ /\\__ _\\ /\\ ___\\ ',
869
- "\\ \\___ \\ \\ \\ \\/\\ \\ \\ \\ \\____ \\ \\ \\/\\ \\ \\ \\ \\-. \\ \\ \\ \\__ \\ \\ \\ __ \\ \\/_/\\ \\/ \\ \\ __\\ ",
870
- ' \\/\\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_\\\\"\\_\\ \\ \\_____\\ \\ \\_\\ \\_\\ \\ \\_\\ \\ \\_____\\',
871
- " \\/_____/ \\/_____/ \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_/\\/_/ \\/_/ \\/_____/"
872
- ];
873
- const colors = [c2.blue1, c2.blue2, c2.blue3, c2.blue4, c2.blue5];
874
- log3("");
875
- for (let i = 0; i < lines.length; i++) {
876
- log3(`${c2.bold}${colors[i]}${lines[i]}${c2.reset}`);
877
- }
878
- log3("");
879
- log3(` ${c2.dim}${subtitle}${c2.reset}`);
880
- log3("");
881
- }
882
- function withSpinner(message, fn) {
883
- const frames = ["\u28FE", "\u28FD", "\u28FB", "\u28BF", "\u287F", "\u28DF", "\u28EF", "\u28F7"];
884
- let i = 0;
885
- const id = setInterval(() => {
886
- process.stderr.write(`\r ${c2.blue3}${frames[i++ % frames.length]}${c2.reset} ${message}`);
887
- }, 80);
888
- try {
889
- fn();
890
- clearInterval(id);
891
- process.stderr.write(`\r ${c2.green}\u2713${c2.reset} ${message}
892
- `);
893
- } catch {
894
- clearInterval(id);
895
- process.stderr.write(`\r ${c2.red}\u2717${c2.reset} ${message} \u2014 failed
896
- `);
897
- }
898
- }
899
- function installDeps(dir) {
900
- withSpinner("Installing dependencies...", () => {
901
- execSync2("npm install", { cwd: dir, stdio: "pipe" });
902
- });
903
- }
904
911
  async function main3() {
905
912
  const opts = parseCreateArgs(process.argv);
906
913
  const dir = resolve4(opts.name);
907
914
  printBanner2("Create MCP Server");
908
915
  if (existsSync4(dir)) {
909
- log3(` Error: Directory "${opts.name}" already exists.`);
916
+ log3(` ${c2.red}Error:${c2.reset} Directory "${opts.name}" already exists.`);
910
917
  process.exit(1);
911
918
  }
912
- mkdirSync(dir, { recursive: true });
913
- log3(` Project: ${opts.name}`);
914
- log3(` Language: TypeScript`);
915
- log3(` Policy: ${opts.policy}`);
916
- log3("");
917
- createProject(dir, opts.name, opts.policy);
918
- log3(" Files created:");
919
- log3(" package.json");
920
- log3(" tsconfig.json");
921
- log3(" src/index.ts");
922
- log3(" .mcp.json");
923
- log3(" .gitignore");
919
+ log3(` ${c2.blue3}Project${c2.reset} ${c2.bold}${opts.name}${c2.reset}`);
920
+ log3(` ${c2.blue3}Language${c2.reset} TypeScript`);
921
+ log3(` ${c2.blue3}Policy${c2.reset} ${opts.policy}`);
924
922
  log3("");
923
+ withSpinner("Scaffolding project files...", () => {
924
+ mkdirSync(dir, { recursive: true });
925
+ createProject(dir, opts.name, opts.policy);
926
+ });
925
927
  if (!opts.noInstall) {
926
- installDeps(dir);
927
- log3("");
928
+ withSpinner("Installing dependencies...", () => {
929
+ execSync2("npm install", { cwd: dir, stdio: "pipe" });
930
+ });
928
931
  }
929
- const W = 46;
930
- const line = (s) => log3(` \u2502 ${s.padEnd(W)} \u2502`);
931
- log3(` \u250C${"\u2500".repeat(W + 2)}\u2510`);
932
- line("Project created!");
933
- line("");
934
- line(`cd ${opts.name}`);
935
- line("");
936
- line("npm run build # Build");
937
- line("npm run dev # Dev mode (tsx)");
938
- line("npm start # Run built server");
939
- line("");
940
- line("Set your API key:");
941
- line("export SOLONGATE_API_KEY=sg_live_xxx");
942
- log3(` \u2514${"\u2500".repeat(W + 2)}\u2518`);
932
+ log3("");
933
+ const W = 52;
934
+ const hr = "\u2500".repeat(W);
935
+ const pad = (s) => s.padEnd(W);
936
+ const bLine = (s) => log3(` ${c2.dim}\u2502${c2.reset} ${pad(s)} ${c2.dim}\u2502${c2.reset}`);
937
+ const bEmpty = () => bLine("");
938
+ log3(` ${c2.dim}\u256D${hr}\u256E${c2.reset}`);
939
+ log3(` ${c2.dim}\u2502${c2.reset} ${c2.green}${c2.bold}${"\u2714 Project created successfully!".padEnd(W)}${c2.reset} ${c2.dim}\u2502${c2.reset}`);
940
+ log3(` ${c2.dim}\u251C${hr}\u2524${c2.reset}`);
941
+ bEmpty();
942
+ bLine(`${c2.yellow}Next steps:${c2.reset}`);
943
+ bEmpty();
944
+ bLine(` ${c2.cyan}$${c2.reset} cd ${c2.bold}${opts.name}${c2.reset}`);
945
+ bLine(` ${c2.cyan}$${c2.reset} npm run build`);
946
+ bLine(` ${c2.cyan}$${c2.reset} npm run dev ${c2.dim}# dev mode${c2.reset}`);
947
+ bLine(` ${c2.cyan}$${c2.reset} npm start ${c2.dim}# production${c2.reset}`);
948
+ bEmpty();
949
+ log3(` ${c2.dim}\u251C${hr}\u2524${c2.reset}`);
950
+ bEmpty();
951
+ bLine(`${c2.yellow}Set your API key:${c2.reset}`);
952
+ bEmpty();
953
+ bLine(` ${c2.cyan}$${c2.reset} export SOLONGATE_API_KEY=${c2.blue3}sg_live_xxx${c2.reset}`);
954
+ bEmpty();
955
+ bLine(`${c2.dim}Get your key at ${c2.blue4}https://solongate.com${c2.reset}`);
956
+ bEmpty();
957
+ log3(` ${c2.dim}\u2570${hr}\u256F${c2.reset}`);
943
958
  log3("");
944
959
  }
945
960
  var c2;
@@ -950,16 +965,20 @@ var init_create = __esm({
950
965
  reset: "\x1B[0m",
951
966
  bold: "\x1B[1m",
952
967
  dim: "\x1B[2m",
968
+ italic: "\x1B[3m",
953
969
  white: "\x1B[97m",
954
- blue1: "\x1B[38;2;30;64;175m",
955
- // dark blue
956
- blue2: "\x1B[38;2;50;100;200m",
957
- blue3: "\x1B[38;2;80;140;220m",
958
- blue4: "\x1B[38;2;120;170;235m",
959
- blue5: "\x1B[38;2;170;200;245m",
960
- // light blue → white
961
- green: "\x1B[32m",
962
- red: "\x1B[31m"
970
+ gray: "\x1B[90m",
971
+ blue1: "\x1B[38;2;20;50;160m",
972
+ blue2: "\x1B[38;2;40;80;190m",
973
+ blue3: "\x1B[38;2;60;110;215m",
974
+ blue4: "\x1B[38;2;90;140;230m",
975
+ blue5: "\x1B[38;2;130;170;240m",
976
+ blue6: "\x1B[38;2;170;200;250m",
977
+ green: "\x1B[38;2;80;200;120m",
978
+ red: "\x1B[38;2;220;80;80m",
979
+ cyan: "\x1B[38;2;100;200;220m",
980
+ yellow: "\x1B[38;2;220;200;80m",
981
+ bgBlue: "\x1B[48;2;20;50;160m"
963
982
  };
964
983
  main3().catch((err) => {
965
984
  log3(`Fatal: ${err instanceof Error ? err.message : String(err)}`);
package/dist/init.js CHANGED
@@ -149,26 +149,29 @@ async function main() {
149
149
  reset: "\x1B[0m",
150
150
  bold: "\x1B[1m",
151
151
  dim: "\x1B[2m",
152
- blue1: "\x1B[38;2;30;64;175m",
153
- blue2: "\x1B[38;2;50;100;200m",
154
- blue3: "\x1B[38;2;80;140;220m",
155
- blue4: "\x1B[38;2;120;170;235m",
156
- blue5: "\x1B[38;2;170;200;245m"
152
+ italic: "\x1B[3m",
153
+ blue1: "\x1B[38;2;20;50;160m",
154
+ blue2: "\x1B[38;2;40;80;190m",
155
+ blue3: "\x1B[38;2;60;110;215m",
156
+ blue4: "\x1B[38;2;90;140;230m",
157
+ blue5: "\x1B[38;2;130;170;240m",
158
+ blue6: "\x1B[38;2;170;200;250m"
157
159
  };
158
160
  const bannerLines = [
159
- " ______ ______ __ ______ __ __ ______ ______ ______ ______ ",
160
- '/\\ ___\\ /\\ __ \\ /\\ \\ /\\ __ \\ /\\ "-.\\ \\ /\\ ___\\ /\\ __ \\ /\\__ _\\ /\\ ___\\ ',
161
- "\\ \\___ \\ \\ \\ \\/\\ \\ \\ \\ \\____ \\ \\ \\/\\ \\ \\ \\ \\-. \\ \\ \\ \\__ \\ \\ \\ __ \\ \\/_/\\ \\/ \\ \\ __\\ ",
162
- ' \\/\\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_\\\\"\\_\\ \\ \\_____\\ \\ \\_\\ \\_\\ \\ \\_\\ \\ \\_____\\',
163
- " \\/_____/ \\/_____/ \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_/\\/_/ \\/_/ \\/_____/"
161
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
162
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
163
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
164
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
165
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
166
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
164
167
  ];
165
- const bannerColors = [_c.blue1, _c.blue2, _c.blue3, _c.blue4, _c.blue5];
168
+ const bannerColors = [_c.blue1, _c.blue2, _c.blue3, _c.blue4, _c.blue5, _c.blue6];
166
169
  console.error("");
167
170
  for (let i = 0; i < bannerLines.length; i++) {
168
171
  console.error(`${_c.bold}${bannerColors[i]}${bannerLines[i]}${_c.reset}`);
169
172
  }
170
173
  console.error("");
171
- console.error(` ${_c.dim}Init Setup${_c.reset}`);
174
+ console.error(` ${_c.dim}${_c.italic}Init Setup${_c.reset}`);
172
175
  console.error("");
173
176
  const configInfo = findConfigFile(options.configPath);
174
177
  if (!configInfo) {
package/dist/inject.js CHANGED
@@ -65,27 +65,32 @@ var c = {
65
65
  reset: "\x1B[0m",
66
66
  bold: "\x1B[1m",
67
67
  dim: "\x1B[2m",
68
- blue1: "\x1B[38;2;30;64;175m",
69
- blue2: "\x1B[38;2;50;100;200m",
70
- blue3: "\x1B[38;2;80;140;220m",
71
- blue4: "\x1B[38;2;120;170;235m",
72
- blue5: "\x1B[38;2;170;200;245m"
68
+ italic: "\x1B[3m",
69
+ green: "\x1B[38;2;80;200;120m",
70
+ red: "\x1B[38;2;220;80;80m",
71
+ blue1: "\x1B[38;2;20;50;160m",
72
+ blue2: "\x1B[38;2;40;80;190m",
73
+ blue3: "\x1B[38;2;60;110;215m",
74
+ blue4: "\x1B[38;2;90;140;230m",
75
+ blue5: "\x1B[38;2;130;170;240m",
76
+ blue6: "\x1B[38;2;170;200;250m"
73
77
  };
74
78
  function printBanner(subtitle) {
75
79
  const lines = [
76
- " ______ ______ __ ______ __ __ ______ ______ ______ ______ ",
77
- '/\\ ___\\ /\\ __ \\ /\\ \\ /\\ __ \\ /\\ "-.\\ \\ /\\ ___\\ /\\ __ \\ /\\__ _\\ /\\ ___\\ ',
78
- "\\ \\___ \\ \\ \\ \\/\\ \\ \\ \\ \\____ \\ \\ \\/\\ \\ \\ \\ \\-. \\ \\ \\ \\__ \\ \\ \\ __ \\ \\/_/\\ \\/ \\ \\ __\\ ",
79
- ' \\/\\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_\\\\"\\_\\ \\ \\_____\\ \\ \\_\\ \\_\\ \\ \\_\\ \\ \\_____\\',
80
- " \\/_____/ \\/_____/ \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_/\\/_/ \\/_/ \\/_____/"
80
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
81
+ " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
82
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 ",
83
+ " \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D ",
84
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
85
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"
81
86
  ];
82
- const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5];
87
+ const colors = [c.blue1, c.blue2, c.blue3, c.blue4, c.blue5, c.blue6];
83
88
  log("");
84
89
  for (let i = 0; i < lines.length; i++) {
85
90
  log(`${c.bold}${colors[i]}${lines[i]}${c.reset}`);
86
91
  }
87
92
  log("");
88
- log(` ${c.dim}${subtitle}${c.reset}`);
93
+ log(` ${c.dim}${c.italic}${subtitle}${c.reset}`);
89
94
  log("");
90
95
  }
91
96
  function detectProject() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solongate/proxy",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "MCP security proxy — protect any MCP server with policies, input validation, rate limiting, and audit logging. Zero code changes required.",
5
5
  "type": "module",
6
6
  "bin": {