@jacobbd/relay-ai 0.4.1 → 0.4.3

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/README.md CHANGED
@@ -15,15 +15,11 @@
15
15
  >
16
16
  > <a href="https://buymeacoffee.com/jacobbd"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="42"></a>
17
17
 
18
- <p align="center">
19
- <a href="https://youtu.be/IvsUPHLhX0o">
20
- <img src="assets/demo-part1-thumbnail.png" alt="relay-ai demo — installation, configuration, Claude Code, Claude Cowork & Claude Code Desktop (Part 1)" width="100%">
21
- </a>
22
- </p>
18
+ 📺 **Watch the Demos**
23
19
 
24
- > 🎥 **Watch the Demos:**
25
- > - **Demo (Part 1):** Installation · Configuration · Claude Code · Claude Cowork & Claude Code Desktop — [watch on YouTube](https://youtu.be/IvsUPHLhX0o)
26
- > - **Demo (Part 2):** OpenAI Codex CLI & Codex Desktop App — [watch on YouTube](https://youtu.be/42oiOB8IAu4)
20
+ | **Claude Code / Cowork / Desktop** | **Codex CLI & Desktop App** | **Gemini CLI** |
21
+ |:---:|:---:|:---:|
22
+ | [![Claude Demo](https://img.youtube.com/vi/IvsUPHLhX0o/mqdefault.jpg)](https://youtu.be/IvsUPHLhX0o) | [![Codex Demo](https://img.youtube.com/vi/42oiOB8IAu4/mqdefault.jpg)](https://youtu.be/42oiOB8IAu4) | [![Gemini Demo](https://img.youtube.com/vi/g7JKvqOHJl4/mqdefault.jpg)](https://www.youtube.com/watch?v=g7JKvqOHJl4) |
27
23
 
28
24
  **relay-ai** is an interactive CLI — and now a **visual launcher** — that connects AI coding tools to any provider and runs local API gateways on your machine. It supports **Claude Code**, **Claude Desktop (Cowork + Code)**, the **OpenAI Codex CLI**, the **ChatGPT desktop app in Codex mode (macOS + Windows)**, **Google Gemini CLI**, and experimental **Antigravity CLI / IDE** support.
29
25
 
@@ -11,7 +11,7 @@ import { join } from "path";
11
11
  // package.json
12
12
  var package_default = {
13
13
  name: "@jacobbd/relay-ai",
14
- version: "0.4.1",
14
+ version: "0.4.3",
15
15
  publishConfig: {
16
16
  access: "public"
17
17
  },
@@ -7287,10 +7287,12 @@ async function handleAnthropicMessages(req, res, options, modelCache, plog) {
7287
7287
  sendJson(res, 200, anthropicResponse);
7288
7288
  }
7289
7289
  } catch (err) {
7290
- const message = err instanceof Error ? err.message : String(err);
7290
+ const message = formatUpstreamError(err);
7291
7291
  plog(`sdk error npm=${model.npm} upstream=${upstreamModelId(model)}: ${message}`);
7292
- if (!res.headersSent) sendJson(res, 502, { error: { message } });
7293
- else res.end();
7292
+ if (!res.headersSent) {
7293
+ const status = upstreamHttpStatus(err, message);
7294
+ sendJson(res, status === 500 ? 502 : status, { error: { message } });
7295
+ } else res.end();
7294
7296
  }
7295
7297
  return;
7296
7298
  }
@@ -7340,10 +7342,12 @@ async function handleOpenAIChatCompletions(req, res, options, modelCache, plog)
7340
7342
  sendJson(res, 200, response);
7341
7343
  }
7342
7344
  } catch (err) {
7343
- const message = err instanceof Error ? err.message : String(err);
7345
+ const message = formatUpstreamError(err);
7344
7346
  plog(`sdk error npm=${model.npm} upstream=${upstreamModelId(model)}: ${message}`);
7345
- if (!res.headersSent) sendJson(res, 502, { error: { message } });
7346
- else res.end();
7347
+ if (!res.headersSent) {
7348
+ const status = upstreamHttpStatus(err, message);
7349
+ sendJson(res, status === 500 ? 502 : status, { error: { message } });
7350
+ } else res.end();
7347
7351
  }
7348
7352
  }
7349
7353
  function lookupModel(res, catalog, modelId) {
@@ -10404,4 +10408,4 @@ export {
10404
10408
  quitClaudeAppGracefully,
10405
10409
  launchOrRestartClaudeApp
10406
10410
  };
10407
- //# sourceMappingURL=chunk-2GUFTECU.js.map
10411
+ //# sourceMappingURL=chunk-VSXPAZX4.js.map