claudebox 0.1.0 → 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 (47) hide show
  1. package/README.md +10 -2
  2. package/dist/background-update.d.ts +2 -0
  3. package/dist/background-update.d.ts.map +1 -0
  4. package/dist/background-update.js +48 -0
  5. package/dist/background-update.js.map +1 -0
  6. package/dist/cli.js +58 -50
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +1 -3
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +69 -47
  11. package/dist/config.js.map +1 -1
  12. package/dist/configure.d.ts +2 -0
  13. package/dist/configure.d.ts.map +1 -0
  14. package/dist/configure.js +121 -0
  15. package/dist/configure.js.map +1 -0
  16. package/dist/converter.d.ts.map +1 -1
  17. package/dist/converter.js +42 -33
  18. package/dist/converter.js.map +1 -1
  19. package/dist/logger.d.ts +1 -1
  20. package/dist/logger.d.ts.map +1 -1
  21. package/dist/logger.js +20 -16
  22. package/dist/logger.js.map +1 -1
  23. package/dist/providers/gemini.d.ts +2 -2
  24. package/dist/providers/gemini.d.ts.map +1 -1
  25. package/dist/providers/gemini.js +14 -11
  26. package/dist/providers/gemini.js.map +1 -1
  27. package/dist/providers/index.d.ts +3 -3
  28. package/dist/providers/index.js +3 -3
  29. package/dist/providers/ollama.d.ts +2 -2
  30. package/dist/providers/ollama.d.ts.map +1 -1
  31. package/dist/providers/ollama.js +14 -11
  32. package/dist/providers/ollama.js.map +1 -1
  33. package/dist/providers/openai.d.ts +2 -2
  34. package/dist/providers/openai.d.ts.map +1 -1
  35. package/dist/providers/openai.js +10 -10
  36. package/dist/providers/openai.js.map +1 -1
  37. package/dist/server.js +20 -20
  38. package/dist/translator.d.ts +1 -1
  39. package/dist/translator.d.ts.map +1 -1
  40. package/dist/translator.js +40 -42
  41. package/dist/translator.js.map +1 -1
  42. package/dist/types.d.ts +14 -14
  43. package/dist/update-checker.d.ts +4 -0
  44. package/dist/update-checker.d.ts.map +1 -0
  45. package/dist/update-checker.js +96 -0
  46. package/dist/update-checker.js.map +1 -0
  47. package/package.json +12 -4
@@ -1,7 +1,7 @@
1
- import OpenAI from "openai";
2
- import { config } from "../config.js";
3
- import { convertNonStreaming, convertStream } from "../converter.js";
4
- import { logVerbose } from "../logger.js";
1
+ import OpenAI from 'openai';
2
+ import { config } from '../config.js';
3
+ import { convertNonStreaming, convertStream } from '../converter.js';
4
+ import { logVerbose } from '../logger.js';
5
5
  let client = null;
6
6
  function getClient() {
7
7
  if (!client) {
@@ -12,18 +12,18 @@ function getClient() {
12
12
  export async function forwardToOpenAI(req, model, reply, requestId) {
13
13
  const client = getClient();
14
14
  if (req.stream) {
15
- reply.raw.setHeader("Content-Type", "text/event-stream");
16
- reply.raw.setHeader("Cache-Control", "no-cache");
17
- reply.raw.setHeader("Connection", "keep-alive");
18
- const stream = await client.chat.completions.create({ ...req, stream: true });
15
+ reply.raw.setHeader('Content-Type', 'text/event-stream');
16
+ reply.raw.setHeader('Cache-Control', 'no-cache');
17
+ reply.raw.setHeader('Connection', 'keep-alive');
18
+ const stream = (await client.chat.completions.create({ ...req, stream: true }));
19
19
  async function* lines() {
20
20
  for await (const chunk of stream) {
21
21
  if (config.verbose >= 2 && requestId) {
22
- logVerbose(requestId, "RESPONSE", chunk);
22
+ logVerbose(requestId, 'RESPONSE', chunk);
23
23
  }
24
24
  yield `data: ${JSON.stringify(chunk)}\n`;
25
25
  }
26
- yield "data: [DONE]\n";
26
+ yield 'data: [DONE]\n';
27
27
  }
28
28
  const msgId = `msg_${Date.now()}`;
29
29
  for await (const sseEvent of convertStream(lines(), model, msgId)) {
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,SAAS,SAAS;IAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAkB,EAAE,KAAa,EAAE,KAAmB,EAAE,SAAkB;IAC9G,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;QACzD,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACjD,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,IAAI,EAAS,CAAQ,CAAC;QAE5F,KAAK,SAAS,CAAC,CAAC,KAAK;YACnB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;oBACrC,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC;gBACD,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3C,CAAC;YACD,MAAM,gBAAgB,CAAC;QACzB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAClE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,KAAK,EAAS,CAAC,CAAC;IACxF,OAAO,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,SAAS,SAAS;IAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAkB,EAClB,KAAa,EACb,KAAmB,EACnB,SAAkB;IAElB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;QACzD,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACjD,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,IAAI,EAAS,CAAC,CAAQ,CAAC;QAE9F,KAAK,SAAS,CAAC,CAAC,KAAK;YACnB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;oBACrC,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC;gBACD,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3C,CAAC;YACD,MAAM,gBAAgB,CAAC;QACzB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAClE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,KAAK,EAAS,CAAC,CAAC;IACxF,OAAO,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC"}
package/dist/server.js CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import Fastify from "fastify";
3
- import { config } from "./config.js";
4
- import { translateRequest } from "./translator.js";
5
- import { forwardToOpenAI, forwardToGemini, forwardToOllama } from "./providers/index.js";
6
- import { logRequest, logVerbose, logRequestStart, logInfo } from "./logger.js";
7
- import { randomBytes } from "node:crypto";
2
+ import Fastify from 'fastify';
3
+ import { config } from './config.js';
4
+ import { translateRequest } from './translator.js';
5
+ import { forwardToOpenAI, forwardToGemini, forwardToOllama } from './providers/index.js';
6
+ import { logRequest, logVerbose, logRequestStart, logInfo } from './logger.js';
7
+ import { randomBytes } from 'node:crypto';
8
8
  const fastify = Fastify({ logger: false });
9
9
  function generateId() {
10
- return randomBytes(4).toString("hex");
10
+ return randomBytes(4).toString('hex');
11
11
  }
12
- fastify.post("/v1/messages", async (request, reply) => {
12
+ fastify.post('/v1/messages', async (request, reply) => {
13
13
  const body = request.body;
14
14
  const startTime = Date.now();
15
15
  const requestId = generateId();
@@ -18,16 +18,16 @@ fastify.post("/v1/messages", async (request, reply) => {
18
18
  logRequestStart(requestId, body.model, model, provider, body.messages?.length ?? 0, body.tools?.length ?? 0);
19
19
  logInfo(requestId, `Forwarding to ${provider} as ${model}`);
20
20
  if (config.verbose >= 2) {
21
- logVerbose(requestId, "PROMPT", body);
21
+ logVerbose(requestId, 'PROMPT', body);
22
22
  }
23
23
  let response;
24
- if (provider === "openai") {
24
+ if (provider === 'openai') {
25
25
  response = await forwardToOpenAI(translatedRequest, model, reply, requestId);
26
26
  }
27
- else if (provider === "gemini") {
27
+ else if (provider === 'gemini') {
28
28
  response = await forwardToGemini(translatedRequest, model, reply, requestId);
29
29
  }
30
- else if (provider === "ollama") {
30
+ else if (provider === 'ollama') {
31
31
  response = await forwardToOllama(translatedRequest, model, reply, requestId);
32
32
  }
33
33
  else {
@@ -35,31 +35,31 @@ fastify.post("/v1/messages", async (request, reply) => {
35
35
  return;
36
36
  }
37
37
  if (config.verbose >= 2 && !body.stream) {
38
- logVerbose(requestId, "RESPONSE", response);
38
+ logVerbose(requestId, 'RESPONSE', response);
39
39
  }
40
- logInfo(requestId, "Request processed successfully");
40
+ logInfo(requestId, 'Request processed successfully');
41
41
  logRequest(requestId, body.model, model, provider, body.messages?.length ?? 0, body.tools?.length ?? 0, reply.statusCode, Date.now() - startTime);
42
42
  return response;
43
43
  }
44
44
  catch (err) {
45
45
  console.error(`\nāŒ Error processing request ${requestId}:`, err);
46
- logRequest(requestId, body.model, "error", "unknown", body.messages?.length ?? 0, body.tools?.length ?? 0, 500, Date.now() - startTime);
46
+ logRequest(requestId, body.model, 'error', 'unknown', body.messages?.length ?? 0, body.tools?.length ?? 0, 500, Date.now() - startTime);
47
47
  reply.code(500).send({
48
- type: "error",
49
- error: { type: "server_error", message: err?.message ?? "Internal server error" },
48
+ type: 'error',
49
+ error: { type: 'server_error', message: err?.message ?? 'Internal server error' },
50
50
  });
51
51
  }
52
52
  });
53
- fastify.get("/health", async () => ({ status: "ok" }));
53
+ fastify.get('/health', async () => ({ status: 'ok' }));
54
54
  const start = async () => {
55
55
  try {
56
- await fastify.listen({ port: config.port, host: "0.0.0.0" });
56
+ await fastify.listen({ port: config.port, host: '0.0.0.0' });
57
57
  console.log(`\nšŸš€ claude-code-proxy running on http://localhost:${config.port}`);
58
58
  console.log(` Provider : ${config.preferredProvider}`);
59
59
  console.log(` Big model: ${config.bigModel}`);
60
60
  console.log(` Small mdl: ${config.smallModel}`);
61
61
  console.log(` Verbose : ${config.verbose}`);
62
- if (config.preferredProvider === "ollama") {
62
+ if (config.preferredProvider === 'ollama') {
63
63
  console.log(` Ollama : ${config.ollamaApiBase}`);
64
64
  }
65
65
  console.log(`\n Use with: ANTHROPIC_BASE_URL=http://localhost:${config.port} claude\n`);
@@ -1,3 +1,3 @@
1
- import type { AnthropicRequest, TranslatedRequest } from "./types.js";
1
+ import type { AnthropicRequest, TranslatedRequest } from './types.js';
2
2
  export declare function translateRequest(req: AnthropicRequest): TranslatedRequest;
3
3
  //# sourceMappingURL=translator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAQhB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAmJpB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,iBAAiB,CA2BzE"}
1
+ {"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAQhB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAqJpB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,iBAAiB,CA2BzE"}
@@ -1,16 +1,14 @@
1
- import { config } from "./config.js";
1
+ import { config } from './config.js';
2
2
  // Map Claude model names → big/small model based on provider
3
3
  function resolveModel(claudeModel) {
4
4
  const lc = claudeModel.toLowerCase();
5
5
  // If the user explicitly passes a known model name, use it directly
6
6
  if (config.isOpenAIModel(claudeModel))
7
- return { provider: "openai", model: claudeModel };
7
+ return { provider: 'openai', model: claudeModel };
8
8
  if (config.isGeminiModel(claudeModel))
9
- return { provider: "gemini", model: claudeModel };
10
- if (config.isOllamaModel(claudeModel))
11
- return { provider: "ollama", model: claudeModel };
9
+ return { provider: 'gemini', model: claudeModel };
12
10
  // Map Claude haiku → small model, sonnet/opus → big model
13
- const isSmall = lc.includes("haiku");
11
+ const isSmall = lc.includes('haiku');
14
12
  const targetModel = isSmall ? config.smallModel : config.bigModel;
15
13
  const provider = config.resolveProvider(targetModel);
16
14
  return { provider, model: targetModel };
@@ -18,24 +16,22 @@ function resolveModel(claudeModel) {
18
16
  function systemPromptToString(system) {
19
17
  if (!system)
20
18
  return undefined;
21
- if (typeof system === "string")
19
+ if (typeof system === 'string')
22
20
  return system;
23
- return system.map((b) => b.text).join("\n");
21
+ return system.map((b) => b.text).join('\n');
24
22
  }
25
23
  function contentBlocksToOpenAI(content) {
26
- if (typeof content === "string")
24
+ if (typeof content === 'string')
27
25
  return content;
28
26
  const parts = [];
29
27
  for (const block of content) {
30
- if (block.type === "text") {
31
- parts.push({ type: "text", text: block.text });
28
+ if (block.type === 'text') {
29
+ parts.push({ type: 'text', text: block.text });
32
30
  }
33
- else if (block.type === "image") {
31
+ else if (block.type === 'image') {
34
32
  const src = block.source;
35
- const url = src.type === "base64"
36
- ? `data:${src.media_type};base64,${src.data}`
37
- : (src.url ?? "");
38
- parts.push({ type: "image_url", image_url: { url } });
33
+ const url = src.type === 'base64' ? `data:${src.media_type};base64,${src.data}` : (src.url ?? '');
34
+ parts.push({ type: 'image_url', image_url: { url } });
39
35
  }
40
36
  // tool_use and tool_result handled separately below
41
37
  }
@@ -45,53 +41,55 @@ function translateMessages(messages) {
45
41
  const result = [];
46
42
  for (const msg of messages) {
47
43
  const content = msg.content;
48
- if (typeof content === "string") {
44
+ if (typeof content === 'string') {
49
45
  result.push({ role: msg.role, content });
50
46
  continue;
51
47
  }
52
48
  // Check if this assistant message contains tool_use blocks
53
- const toolUseBlocks = content.filter((b) => b.type === "tool_use");
54
- const textBlocks = content.filter((b) => b.type === "text");
55
- if (msg.role === "assistant" && toolUseBlocks.length > 0) {
49
+ const toolUseBlocks = content.filter((b) => b.type === 'tool_use');
50
+ const textBlocks = content.filter((b) => b.type === 'text');
51
+ if (msg.role === 'assistant' && toolUseBlocks.length > 0) {
56
52
  const toolCalls = toolUseBlocks.map((b) => {
57
- if (b.type !== "tool_use")
58
- throw new Error("unreachable");
53
+ if (b.type !== 'tool_use')
54
+ throw new Error('unreachable');
59
55
  return {
60
56
  id: b.id,
61
- type: "function",
57
+ type: 'function',
62
58
  function: {
63
59
  name: b.name,
64
60
  arguments: JSON.stringify(b.input),
65
61
  },
66
62
  };
67
63
  });
68
- const textContent = textBlocks.length > 0 ? textBlocks.map((b) => (b.type === "text" ? b.text : "")).join("") : null;
69
- result.push({ role: "assistant", content: textContent, tool_calls: toolCalls });
64
+ const textContent = textBlocks.length > 0
65
+ ? textBlocks.map((b) => (b.type === 'text' ? b.text : '')).join('')
66
+ : null;
67
+ result.push({ role: 'assistant', content: textContent, tool_calls: toolCalls });
70
68
  continue;
71
69
  }
72
70
  // Check for tool_result blocks (user role)
73
- const toolResultBlocks = content.filter((b) => b.type === "tool_result");
74
- if (msg.role === "user" && toolResultBlocks.length > 0) {
71
+ const toolResultBlocks = content.filter((b) => b.type === 'tool_result');
72
+ if (msg.role === 'user' && toolResultBlocks.length > 0) {
75
73
  for (const block of toolResultBlocks) {
76
- if (block.type !== "tool_result")
74
+ if (block.type !== 'tool_result')
77
75
  continue;
78
- const toolContent = typeof block.content === "string"
76
+ const toolContent = typeof block.content === 'string'
79
77
  ? block.content
80
78
  : Array.isArray(block.content)
81
- ? block.content.map((b) => ("text" in b ? b.text : "")).join("")
82
- : "";
79
+ ? block.content.map((b) => ('text' in b ? b.text : '')).join('')
80
+ : '';
83
81
  result.push({
84
- role: "tool",
82
+ role: 'tool',
85
83
  tool_call_id: block.tool_use_id,
86
84
  content: toolContent,
87
85
  });
88
86
  }
89
87
  // Any non-tool_result content goes as a separate user message
90
- const nonToolBlocks = content.filter((b) => b.type !== "tool_result");
88
+ const nonToolBlocks = content.filter((b) => b.type !== 'tool_result');
91
89
  if (nonToolBlocks.length > 0) {
92
90
  const parts = contentBlocksToOpenAI(nonToolBlocks);
93
91
  if (parts)
94
- result.push({ role: "user", content: parts });
92
+ result.push({ role: 'user', content: parts });
95
93
  }
96
94
  continue;
97
95
  }
@@ -107,7 +105,7 @@ function translateTools(tools) {
107
105
  if (!tools || tools.length === 0)
108
106
  return undefined;
109
107
  return tools.map((t) => ({
110
- type: "function",
108
+ type: 'function',
111
109
  function: {
112
110
  name: t.name,
113
111
  description: t.description,
@@ -118,12 +116,12 @@ function translateTools(tools) {
118
116
  function translateToolChoice(toolChoice) {
119
117
  if (!toolChoice)
120
118
  return undefined;
121
- if (toolChoice.type === "auto")
122
- return "auto";
123
- if (toolChoice.type === "any")
124
- return "required";
125
- if (toolChoice.type === "tool" && toolChoice.name) {
126
- return { type: "function", function: { name: toolChoice.name } };
119
+ if (toolChoice.type === 'auto')
120
+ return 'auto';
121
+ if (toolChoice.type === 'any')
122
+ return 'required';
123
+ if (toolChoice.type === 'tool' && toolChoice.name) {
124
+ return { type: 'function', function: { name: toolChoice.name } };
127
125
  }
128
126
  return undefined;
129
127
  }
@@ -132,7 +130,7 @@ export function translateRequest(req) {
132
130
  const systemContent = systemPromptToString(req.system);
133
131
  const messages = translateMessages(req.messages);
134
132
  if (systemContent) {
135
- messages.unshift({ role: "system", content: systemContent });
133
+ messages.unshift({ role: 'system', content: systemContent });
136
134
  }
137
135
  const openAIReq = {
138
136
  model,
@@ -1 +1 @@
1
- {"version":3,"file":"translator.js","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"translator.js","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,30 +1,30 @@
1
1
  export interface AnthropicContentBlockText {
2
- type: "text";
2
+ type: 'text';
3
3
  text: string;
4
4
  }
5
5
  export interface AnthropicContentBlockImage {
6
- type: "image";
6
+ type: 'image';
7
7
  source: {
8
- type: "base64" | "url";
8
+ type: 'base64' | 'url';
9
9
  media_type?: string;
10
10
  data?: string;
11
11
  url?: string;
12
12
  };
13
13
  }
14
14
  export interface AnthropicContentBlockToolUse {
15
- type: "tool_use";
15
+ type: 'tool_use';
16
16
  id: string;
17
17
  name: string;
18
18
  input: Record<string, unknown>;
19
19
  }
20
20
  export interface AnthropicContentBlockToolResult {
21
- type: "tool_result";
21
+ type: 'tool_result';
22
22
  tool_use_id: string;
23
23
  content: string | AnthropicContentBlock[];
24
24
  }
25
25
  export type AnthropicContentBlock = AnthropicContentBlockText | AnthropicContentBlockImage | AnthropicContentBlockToolUse | AnthropicContentBlockToolResult;
26
26
  export interface AnthropicMessage {
27
- role: "user" | "assistant";
27
+ role: 'user' | 'assistant';
28
28
  content: string | AnthropicContentBlock[];
29
29
  }
30
30
  export interface AnthropicTool {
@@ -51,11 +51,11 @@ export interface AnthropicRequest {
51
51
  stop_sequences?: string[];
52
52
  }
53
53
  export interface OpenAIContentPartText {
54
- type: "text";
54
+ type: 'text';
55
55
  text: string;
56
56
  }
57
57
  export interface OpenAIContentPartImage {
58
- type: "image_url";
58
+ type: 'image_url';
59
59
  image_url: {
60
60
  url: string;
61
61
  };
@@ -63,21 +63,21 @@ export interface OpenAIContentPartImage {
63
63
  export type OpenAIContentPart = OpenAIContentPartText | OpenAIContentPartImage;
64
64
  export interface OpenAIToolCall {
65
65
  id: string;
66
- type: "function";
66
+ type: 'function';
67
67
  function: {
68
68
  name: string;
69
69
  arguments: string;
70
70
  };
71
71
  }
72
72
  export interface OpenAIMessage {
73
- role: "system" | "user" | "assistant" | "tool";
73
+ role: 'system' | 'user' | 'assistant' | 'tool';
74
74
  content: string | OpenAIContentPart[] | null;
75
75
  tool_calls?: OpenAIToolCall[];
76
76
  tool_call_id?: string;
77
77
  name?: string;
78
78
  }
79
79
  export interface OpenAITool {
80
- type: "function";
80
+ type: 'function';
81
81
  function: {
82
82
  name: string;
83
83
  description?: string;
@@ -92,8 +92,8 @@ export interface OpenAIRequest {
92
92
  top_p?: number;
93
93
  stream?: boolean;
94
94
  tools?: OpenAITool[];
95
- tool_choice?: "auto" | "none" | "required" | {
96
- type: "function";
95
+ tool_choice?: 'auto' | 'none' | 'required' | {
96
+ type: 'function';
97
97
  function: {
98
98
  name: string;
99
99
  };
@@ -101,7 +101,7 @@ export interface OpenAIRequest {
101
101
  stop?: string[];
102
102
  }
103
103
  export interface TranslatedRequest {
104
- provider: "openai" | "gemini" | "ollama";
104
+ provider: 'openai' | 'gemini' | 'ollama';
105
105
  model: string;
106
106
  translatedRequest: OpenAIRequest;
107
107
  }
@@ -0,0 +1,4 @@
1
+ export declare function checkAndUpdate(): Promise<{
2
+ handled: boolean;
3
+ }>;
4
+ //# sourceMappingURL=update-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"AAmBA,wBAAsB,cAAc;;GA0FnC"}
@@ -0,0 +1,96 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import { spawn, spawnSync } from 'node:child_process';
5
+ import { createRequire } from 'node:module';
6
+ import chalk from 'chalk';
7
+ import { confirm } from '@inquirer/prompts';
8
+ const require = createRequire(import.meta.url);
9
+ const currentPackage = require('../package.json');
10
+ const currentVersion = currentPackage.version;
11
+ const CONFIG_DIR = path.join(os.homedir(), '.ccproxy');
12
+ const STATUS_FILE = path.join(CONFIG_DIR, 'update-status.json');
13
+ const UPDATE_SCRIPT_PATH = path.join(new URL('.', import.meta.url).pathname, 'background-update.js');
14
+ export async function checkAndUpdate() {
15
+ // 1. Synchronously check if there's a pending update
16
+ let pendingUpdate = false;
17
+ let latestVersion = currentVersion;
18
+ if (fs.existsSync(STATUS_FILE)) {
19
+ try {
20
+ const statusContent = fs.readFileSync(STATUS_FILE, 'utf-8');
21
+ const status = JSON.parse(statusContent);
22
+ // Basic semver check for string comparison. E.g "0.1.1" !== "0.1.0"
23
+ if (status.latestVersion && status.latestVersion !== currentVersion) {
24
+ pendingUpdate = true;
25
+ latestVersion = status.latestVersion;
26
+ }
27
+ }
28
+ catch (e) {
29
+ // ignore parse errors
30
+ }
31
+ }
32
+ // 2. If update found, prompt synchronously
33
+ if (pendingUpdate) {
34
+ console.log(chalk.yellow(`\nšŸš€ A new version of claudebox is available! ${currentVersion} -> ${latestVersion}`));
35
+ // Check if inquirer/prompts is bypassed by strict shell pipes
36
+ if (process.stdout.isTTY) {
37
+ const doUpdate = await confirm({
38
+ message: `Do you want to update to ${latestVersion} now?`,
39
+ default: true,
40
+ });
41
+ if (doUpdate) {
42
+ console.log(chalk.cyan('\nUpdating claudebox... Please wait.'));
43
+ const result = spawnSync('npm', ['install', '-g', 'claudebox'], {
44
+ stdio: 'inherit',
45
+ shell: true,
46
+ });
47
+ if (result.status === 0) {
48
+ console.log(chalk.green('āœ… Update successful!'));
49
+ // Delete the status file so we don't end in an immediate update loop if versions hadn't synced
50
+ try {
51
+ fs.unlinkSync(STATUS_FILE);
52
+ }
53
+ catch (e) { }
54
+ console.log(chalk.cyan('Restarting ccproxy...\n'));
55
+ // Respawn with the same arguments using the newly globally installed binary
56
+ const newProcess = spawn('ccproxy', process.argv.slice(2), {
57
+ stdio: 'inherit',
58
+ shell: true,
59
+ detached: false,
60
+ });
61
+ newProcess.on('close', (code) => {
62
+ process.exit(code ?? 0);
63
+ });
64
+ return { handled: true }; // Tell CLI to not continue execution natively
65
+ }
66
+ else {
67
+ console.log(chalk.red('Update failed. Resuming normal execution...\n'));
68
+ }
69
+ }
70
+ }
71
+ else {
72
+ console.log(chalk.dim('Run `npm i -g claudebox` to update.\n'));
73
+ }
74
+ }
75
+ // 3. Spawn the detached background checker
76
+ if (fs.existsSync(UPDATE_SCRIPT_PATH)) {
77
+ try {
78
+ const { config } = await import('./config.js');
79
+ const args = [UPDATE_SCRIPT_PATH];
80
+ if (config.verbose > 0)
81
+ args.push('--verbose');
82
+ const child = spawn(process.execPath, args, {
83
+ detached: true,
84
+ stdio: 'ignore',
85
+ });
86
+ child.unref(); // Ensure parent can exit without waiting for this
87
+ if (config.verbose > 0)
88
+ console.log(chalk.dim(`[update-checker] Spawned background check with PID ${child.pid}`));
89
+ }
90
+ catch (e) {
91
+ // Silent fail
92
+ }
93
+ }
94
+ return { handled: false };
95
+ }
96
+ //# sourceMappingURL=update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudebox",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Use Claude Code with any AI provider: OpenAI, Gemini, or Ollama",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",
@@ -8,10 +8,12 @@
8
8
  "ccproxy": "dist/cli.js"
9
9
  },
10
10
  "scripts": {
11
+ "prepare": "husky install",
11
12
  "build": "tsc",
12
13
  "dev": "tsx watch src/cli.ts",
13
14
  "start": "node dist/cli.js",
14
- "prepublishOnly": "npm run build"
15
+ "prepublishOnly": "npm run build",
16
+ "format": "prettier --write \"src/**/*.ts\""
15
17
  },
16
18
  "keywords": [
17
19
  "claude",
@@ -24,14 +26,20 @@
24
26
  ],
25
27
  "license": "BSD-3-Clause",
26
28
  "dependencies": {
29
+ "@inquirer/prompts": "^8.3.0",
27
30
  "chalk": "^5.6.2",
28
31
  "dotenv": "^16.4.5",
29
- "fastify": "^4.28.0",
32
+ "fastify": "^5.7.3",
30
33
  "figlet": "^1.10.0",
34
+ "husky": "^9.1.7",
35
+ "inquirer": "^13.3.0",
31
36
  "openai": "^4.77.0"
32
37
  },
33
38
  "devDependencies": {
39
+ "@types/inquirer": "^9.0.9",
34
40
  "@types/node": "^22.0.0",
41
+ "commitlint": "^20.4.3",
42
+ "prettier": "^3.8.1",
35
43
  "tsx": "^4.19.0",
36
44
  "typescript": "^5.7.0"
37
45
  },
@@ -56,4 +64,4 @@
56
64
  "type": "git",
57
65
  "url": "git+https://github.com/himasnhu-at/mockserver.git"
58
66
  }
59
- }
67
+ }