cascade-ai 0.12.17 → 0.12.18

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/cli.cjs CHANGED
@@ -4,6 +4,9 @@ var Anthropic = require('@anthropic-ai/sdk');
4
4
  var OpenAI = require('openai');
5
5
  var genai = require('@google/genai');
6
6
  var dns = require('dns');
7
+ var http = require('http');
8
+ var https = require('https');
9
+ var stream = require('stream');
7
10
  var ink = require('ink');
8
11
  var commander = require('commander');
9
12
  var React2 = require('react');
@@ -33,7 +36,6 @@ var worker_threads = require('worker_threads');
33
36
  var Spinner = require('ink-spinner');
34
37
  var ora = require('ora');
35
38
  var SelectInput = require('ink-select-input');
36
- var http = require('http');
37
39
  var express = require('express');
38
40
  var rateLimit = require('express-rate-limit');
39
41
  var bcrypt = require('bcryptjs');
@@ -65,6 +67,8 @@ function _interopNamespace(e) {
65
67
  var Anthropic__default = /*#__PURE__*/_interopDefault(Anthropic);
66
68
  var OpenAI__default = /*#__PURE__*/_interopDefault(OpenAI);
67
69
  var dns__default = /*#__PURE__*/_interopDefault(dns);
70
+ var http__default = /*#__PURE__*/_interopDefault(http);
71
+ var https__default = /*#__PURE__*/_interopDefault(https);
68
72
  var React2__default = /*#__PURE__*/_interopDefault(React2);
69
73
  var chalk9__default = /*#__PURE__*/_interopDefault(chalk9);
70
74
  var dotenv__default = /*#__PURE__*/_interopDefault(dotenv);
@@ -103,7 +107,7 @@ var __export = (target, all) => {
103
107
  var CASCADE_VERSION, CASCADE_CONFIG_FILE, CASCADE_DB_FILE, CASCADE_DASHBOARD_SECRET_FILE, GLOBAL_CONFIG_DIR, GLOBAL_DB_FILE, GLOBAL_KEYSTORE_FILE, GLOBAL_RUNTIME_DB_FILE, DEFAULT_DASHBOARD_PORT, DEFAULT_CONTEXT_LIMIT, DEFAULT_AUTO_SUMMARIZE_AT, MODELS, T1_MODEL_PRIORITY, T2_MODEL_PRIORITY, T3_MODEL_PRIORITY, VISION_MODEL_PRIORITY, COMPLEXITY_T2_COUNT, THEME_NAMES, DEFAULT_THEME, OLLAMA_BASE_URL, LM_STUDIO_BASE_URL, AZURE_BASE_URL_TEMPLATE, TOOL_NAMES, DEFAULT_APPROVAL_REQUIRED;
104
108
  var init_constants = __esm({
105
109
  "src/constants.ts"() {
106
- CASCADE_VERSION = "0.12.17";
110
+ CASCADE_VERSION = "0.12.18";
107
111
  CASCADE_CONFIG_FILE = ".cascade/config.json";
108
112
  CASCADE_DB_FILE = ".cascade/memory.db";
109
113
  CASCADE_DASHBOARD_SECRET_FILE = ".cascade/dashboard-secret";
@@ -1213,6 +1217,48 @@ function preferIpv4Host(url) {
1213
1217
  if (!url) return url;
1214
1218
  return url.replace(/^(https?:\/\/)localhost(?=[:/]|$)/i, "$1127.0.0.1");
1215
1219
  }
1220
+ async function nodeHttpFetch(input, init = {}) {
1221
+ const urlStr = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
1222
+ const u = new URL(urlStr);
1223
+ const lib = u.protocol === "https:" ? https__default.default : http__default.default;
1224
+ const method = (init.method ?? "GET").toUpperCase();
1225
+ const headers = {};
1226
+ const h = init.headers;
1227
+ if (h instanceof Headers) h.forEach((v, k) => {
1228
+ headers[k] = v;
1229
+ });
1230
+ else if (Array.isArray(h)) for (const [k, v] of h) headers[k] = v;
1231
+ else if (h) Object.assign(headers, h);
1232
+ const body = init.body == null ? void 0 : typeof init.body === "string" ? init.body : Buffer.from(init.body);
1233
+ return new Promise((resolve, reject) => {
1234
+ const req = lib.request(
1235
+ {
1236
+ hostname: u.hostname,
1237
+ port: u.port || (u.protocol === "https:" ? 443 : 80),
1238
+ path: u.pathname + u.search,
1239
+ method,
1240
+ headers
1241
+ },
1242
+ (res) => {
1243
+ const stream$1 = stream.Readable.toWeb(res);
1244
+ const respHeaders = new Headers();
1245
+ for (const [k, v] of Object.entries(res.headers)) {
1246
+ if (Array.isArray(v)) respHeaders.set(k, v.join(", "));
1247
+ else if (typeof v === "string") respHeaders.set(k, v);
1248
+ }
1249
+ resolve(new Response(stream$1, {
1250
+ status: res.statusCode ?? 200,
1251
+ statusText: res.statusMessage ?? "",
1252
+ headers: respHeaders
1253
+ }));
1254
+ }
1255
+ );
1256
+ req.on("error", reject);
1257
+ req.setTimeout(15e3, () => req.destroy(new Error("request timed out")));
1258
+ if (body !== void 0) req.write(body);
1259
+ req.end();
1260
+ });
1261
+ }
1216
1262
  var init_net = __esm({
1217
1263
  "src/utils/net.ts"() {
1218
1264
  try {
@@ -1456,7 +1502,8 @@ var init_openai_compatible = __esm({
1456
1502
  super(config, model);
1457
1503
  this.client = new OpenAI__default.default({
1458
1504
  apiKey: config.apiKey ?? "not-required",
1459
- baseURL: preferIpv4Host(config.baseUrl)
1505
+ baseURL: preferIpv4Host(config.baseUrl),
1506
+ fetch: nodeHttpFetch
1460
1507
  });
1461
1508
  }
1462
1509
  modelsUrl() {
@@ -1468,14 +1515,8 @@ var init_openai_compatible = __esm({
1468
1515
  if (this.config.apiKey) h["Authorization"] = `Bearer ${this.config.apiKey}`;
1469
1516
  return h;
1470
1517
  }
1471
- // Discover models with a tolerant direct GET instead of the OpenAI SDK's typed
1472
- // `models.list()`. Local servers (llama.cpp / LM Studio / vLLM) return
1473
- // non-standard `/v1/models` payloads — an extra `models` array, filesystem
1474
- // path ids (`C:\…\model.gguf`) — that can make the SDK's typed pagination
1475
- // throw, which previously surfaced as a misleading "endpoint unreachable".
1476
- // A plain fetch + lenient parse is robust and reports the real HTTP error.
1477
1518
  async listModels() {
1478
- const res = await fetch(this.modelsUrl(), { headers: this.authHeaders() });
1519
+ const res = await nodeHttpFetch(this.modelsUrl(), { headers: this.authHeaders() });
1479
1520
  if (!res.ok) throw new Error(`models endpoint ${this.modelsUrl()} returned HTTP ${res.status}`);
1480
1521
  const body = await res.json();
1481
1522
  const raw = Array.isArray(body?.data) ? body.data : Array.isArray(body?.models) ? body.models : [];
@@ -1503,7 +1544,7 @@ var init_openai_compatible = __esm({
1503
1544
  }
1504
1545
  async isAvailable() {
1505
1546
  try {
1506
- const res = await fetch(this.modelsUrl(), { headers: this.authHeaders() });
1547
+ const res = await nodeHttpFetch(this.modelsUrl(), { headers: this.authHeaders() });
1507
1548
  return res.ok;
1508
1549
  } catch {
1509
1550
  return false;