cascade-ai 0.19.1 → 0.20.1

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/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.1";
114
+ CASCADE_VERSION = "0.20.1";
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";
@@ -3000,7 +3000,13 @@ var ToolsConfigSchema = zod.z.object({
3000
3000
  * - 'worker': node:worker_threads (resource/kill limits, but not capability-confined).
3001
3001
  * - 'auto' (default): use the isolate when `isolated-vm` loads, else fall back to worker.
3002
3002
  */
3003
- 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()
3004
3010
  });
3005
3011
  var HookDefinitionSchema = zod.z.object({
3006
3012
  name: zod.z.string().optional(),
@@ -10141,29 +10147,32 @@ var ToolRegistry = class extends EventEmitter__default.default {
10141
10147
  return tool.execute(input, options);
10142
10148
  }
10143
10149
  registerDefaults() {
10144
- const tools = [
10145
- new ShellTool(this.config.shellAllowlist, this.config.shellBlocklist),
10146
- new FileReadTool(),
10147
- new FileWriteTool(),
10148
- new FileEditTool(),
10149
- new FileDeleteTool(),
10150
- new FileListTool(),
10151
- new GitTool(),
10152
- new GitHubTool(),
10153
- new ImageAnalyzeTool(),
10154
- new PDFCreateTool(),
10155
- new CodeInterpreterTool(),
10156
- new PeerCommunicationTool(),
10157
- new WebSearchTool(this.config.webSearch),
10158
- new GlobTool(),
10159
- new GrepTool(),
10160
- 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()
10161
10169
  ];
10170
+ const tools = candidates2.filter((t) => t !== false);
10162
10171
  for (const tool of tools) {
10163
10172
  tool.setWorkspaceRoot(this.workspaceRoot);
10164
10173
  this.register(tool);
10165
10174
  }
10166
- if (this.config.browserEnabled) {
10175
+ if (this.config.browserEnabled && enabled("browser")) {
10167
10176
  const browser = new BrowserTool();
10168
10177
  browser.setWorkspaceRoot(this.workspaceRoot);
10169
10178
  this.register(browser);