cascade-ai 0.19.0 → 0.20.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.
package/README.md CHANGED
@@ -778,12 +778,13 @@ web/
778
778
  | ✓ | Session rollback button (desktop) + `/rollback` (CLI) |
779
779
  | ✓ | Cost-per-feature attribution (`costByFeature` in results, CLI cost panel, desktop chat) |
780
780
  | ✓ | Project world state (encrypted local log feeding T1 planning) |
781
+ | ✓ | Cascade Cloud (hosted chat — GitHub/Google login, bring-your-own-key, `app.cascadeai.in`) |
781
782
  | 🔜 | VSCode extension (`cascade-vscode`) — see [docs/ROADMAP.md](docs/ROADMAP.md) |
782
783
  | 🔜 | JetBrains extension (`cascade-jetbrains`) — see [docs/ROADMAP.md](docs/ROADMAP.md) |
783
784
  | 🔜 | WASM/isolate sandboxing for tool execution — see [docs/ROADMAP.md](docs/ROADMAP.md) |
784
785
  | 🔜 | Project knowledge graph (world-state v2) — see [docs/ROADMAP.md](docs/ROADMAP.md) |
785
786
  | 🔜 | Multi-plan branching (T1 proposes N plans) — see [docs/ROADMAP.md](docs/ROADMAP.md) |
786
- | 🔜 | Cascade Cloud (hosted dashboard) |
787
+ | 🔜 | Cascade Cloud billing (Razorpay Subscriptions) |
787
788
  | 🔜 | Plugin marketplace |
788
789
  | 🔜 | Voice input (STT) |
789
790
  | 🔜 | Multi-workspace support |
package/bin/cascade.js CHANGED
File without changes
package/dist/cli.cjs CHANGED
@@ -111,7 +111,7 @@ var __export = (target, all) => {
111
111
  var CASCADE_VERSION, CASCADE_CONFIG_FILE, CASCADE_DB_FILE, CASCADE_DASHBOARD_SECRET_FILE, GLOBAL_CONFIG_DIR, GLOBAL_DB_FILE, GLOBAL_KEYSTORE_FILE, GLOBAL_CREDENTIALS_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;
112
112
  var init_constants = __esm({
113
113
  "src/constants.ts"() {
114
- CASCADE_VERSION = "0.19.0";
114
+ CASCADE_VERSION = "0.20.0";
115
115
  CASCADE_CONFIG_FILE = ".cascade/config.json";
116
116
  CASCADE_DB_FILE = ".cascade/memory.db";
117
117
  CASCADE_DASHBOARD_SECRET_FILE = ".cascade/dashboard-secret";
@@ -986,14 +986,27 @@ var init_azure = __esm({
986
986
  return [fromDeployment ?? this.model];
987
987
  }
988
988
  async isAvailable() {
989
+ const params = {
990
+ model: this.model.id,
991
+ messages: [{ role: "user", content: "ping" }],
992
+ max_tokens: 1
993
+ };
989
994
  try {
990
- await this.client.chat.completions.create({
991
- model: this.model.id,
992
- messages: [{ role: "user", content: "ping" }],
993
- max_tokens: 1
994
- });
995
+ await this.client.chat.completions.create(params);
995
996
  return true;
996
- } catch {
997
+ } catch (err) {
998
+ if (err?.message && String(err.message).includes("max_completion_tokens")) {
999
+ try {
1000
+ await this.client.chat.completions.create({
1001
+ model: this.model.id,
1002
+ messages: [{ role: "user", content: "ping" }],
1003
+ max_completion_tokens: 1
1004
+ });
1005
+ return true;
1006
+ } catch {
1007
+ return false;
1008
+ }
1009
+ }
997
1010
  return false;
998
1011
  }
999
1012
  }
@@ -2987,7 +3000,13 @@ var ToolsConfigSchema = zod.z.object({
2987
3000
  * - 'worker': node:worker_threads (resource/kill limits, but not capability-confined).
2988
3001
  * - 'auto' (default): use the isolate when `isolated-vm` loads, else fall back to worker.
2989
3002
  */
2990
- dynamicToolSandbox: zod.z.enum(["isolate", "worker", "auto"]).default("auto")
3003
+ dynamicToolSandbox: zod.z.enum(["isolate", "worker", "auto"]).default("auto"),
3004
+ /**
3005
+ * When set, ONLY these tool names are registered — the sole way to omit a
3006
+ * built-in tool (shell/file/git/…) from existing at all, rather than just
3007
+ * gating it behind approval. Omitted = full default set (unchanged).
3008
+ */
3009
+ enabledTools: zod.z.array(zod.z.string()).optional()
2991
3010
  });
2992
3011
  var HookDefinitionSchema = zod.z.object({
2993
3012
  name: zod.z.string().optional(),
@@ -3874,6 +3893,10 @@ var ModelSelector = class {
3874
3893
  actualId = parts.slice(1).join(":");
3875
3894
  }
3876
3895
  }
3896
+ const registered = this.availableModels.get(actualId);
3897
+ if (registered && (!providerStr || registered.provider === providerStr)) {
3898
+ return registered;
3899
+ }
3877
3900
  if (!providerStr) {
3878
3901
  const lower = actualId.toLowerCase();
3879
3902
  if (lower.includes("claude")) providerStr = "anthropic";
@@ -10124,29 +10147,32 @@ var ToolRegistry = class extends EventEmitter__default.default {
10124
10147
  return tool.execute(input, options);
10125
10148
  }
10126
10149
  registerDefaults() {
10127
- const tools = [
10128
- new ShellTool(this.config.shellAllowlist, this.config.shellBlocklist),
10129
- new FileReadTool(),
10130
- new FileWriteTool(),
10131
- new FileEditTool(),
10132
- new FileDeleteTool(),
10133
- new FileListTool(),
10134
- new GitTool(),
10135
- new GitHubTool(),
10136
- new ImageAnalyzeTool(),
10137
- new PDFCreateTool(),
10138
- new CodeInterpreterTool(),
10139
- new PeerCommunicationTool(),
10140
- new WebSearchTool(this.config.webSearch),
10141
- new GlobTool(),
10142
- new GrepTool(),
10143
- new WebFetchTool()
10150
+ const allowlist = this.config.enabledTools;
10151
+ const enabled = (name) => !allowlist || allowlist.includes(name);
10152
+ const candidates2 = [
10153
+ enabled("shell") && new ShellTool(this.config.shellAllowlist, this.config.shellBlocklist),
10154
+ enabled("file_read") && new FileReadTool(),
10155
+ enabled("file_write") && new FileWriteTool(),
10156
+ enabled("file_edit") && new FileEditTool(),
10157
+ enabled("file_delete") && new FileDeleteTool(),
10158
+ enabled("file_list") && new FileListTool(),
10159
+ enabled("git") && new GitTool(),
10160
+ enabled("github") && new GitHubTool(),
10161
+ enabled("image_analyze") && new ImageAnalyzeTool(),
10162
+ enabled("pdf_create") && new PDFCreateTool(),
10163
+ enabled("run_code") && new CodeInterpreterTool(),
10164
+ enabled("peer_message") && new PeerCommunicationTool(),
10165
+ enabled("web_search") && new WebSearchTool(this.config.webSearch),
10166
+ enabled("glob") && new GlobTool(),
10167
+ enabled("grep") && new GrepTool(),
10168
+ enabled("web_fetch") && new WebFetchTool()
10144
10169
  ];
10170
+ const tools = candidates2.filter((t) => t !== false);
10145
10171
  for (const tool of tools) {
10146
10172
  tool.setWorkspaceRoot(this.workspaceRoot);
10147
10173
  this.register(tool);
10148
10174
  }
10149
- if (this.config.browserEnabled) {
10175
+ if (this.config.browserEnabled && enabled("browser")) {
10150
10176
  const browser = new BrowserTool();
10151
10177
  browser.setWorkspaceRoot(this.workspaceRoot);
10152
10178
  this.register(browser);